爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9887|回复: 10

[经验总结] weekly数据处理成monthly数据

[复制链接]

新浪微博达人勋

发表于 2015-1-15 22:02:40 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 我喜欢风 于 2015-1-17 01:04 编辑

    之前的程序有问题,于2015-01-17_01:00修改
    前言:lz由于工作需要,要用到积雪资料(snow cover),老板推荐使用Rutgers University Global Snow Lab的资料,于是就愉快地去下载了。 http://climate.rutgers.edu/snowcover/docs.php?target=datareq        资料下载之后发现只有weekly的资料,没有monthly的资料。在网站上纠结了很久之后,lz放弃了,就打算自己处理下。
QQ截图20150115213840.png
    处理方法参照网站给的思路(如上),monthly资料由weekly资料进行权重平均得到,权重为某一week包含在该month里的天数除以该month的总天数。例如:某week在2001年6月里有3天,这个月总共有31天,那么其权重就是3/31;若某week在2001年6月里有7天,则权重为7/31.

    NCL程序如下,完整程序见附件
  1. ;=====start day==========
  2. y=1966
  3. m=10
  4. d=4
  5. ;=====end day============
  6. ye=2015
  7. me=1
  8. de=5
  9. ;========================
  10. md=(/-1,31,28,31,30,31,30,31,31,30,31,30,31/)

  11. i=0     ;time index
  12. nn=0    ;number of weeks contained in a month
  13. rn=0    ;residual of a week
  14. rn2=0   ;residual of the last week of a month

  15. ;=====deal with the first month======
  16. if(d.gt.1)
  17.     md(2)=where(isleapyear(y),29,28)  ;leap year
  18.     nn=(md(m)-d+1)/7
  19.     rn=(md(m)-d+1-nn*7)
  20.     m=m+1
  21.     y=where(m.gt.12,y+1,y)
  22.     m=where(m.gt.12,m-12,m)
  23. end if

  24. ;=====deal with the last month======
  25. md(2)=where(isleapyear(ye),29,28)
  26. if(de.lt.md(me))
  27.     me=me-1
  28.     ye=where(me.lt.1,ye-1,ye)
  29.     me=where(me.lt.1,me+12,me)
  30. end if
  31. ;====================================

  32. ;=====creat the new var for monthly data======
  33. ;!!!!!!depended on the dimsizes of weekly var
  34. months=(ye-y)*12+me-m+1
  35. MyTime=ispan(m,months-1+m,1)
  36. MyTime_temp=(y+MyTime/12)*100+MyTime-MyTime/12*12
  37. MyTime=where((MyTime-MyTime/12*12).eq.0,MyTime_temp-88,MyTime_temp)
  38. delete(MyTime_temp)      ;Change time format to yyyymm, for example, 200402

  39. m_var=new((/months,d_var(1),d_var(2)/),"float")
  40. copy_VarAtts(var,m_var)
  41. m_var@valid_time=y+tostring(m)+"_"+ye+tostring(me)+"_monthly_from_weekly"
  42. m_var@method="montly values are calulated by weighting the weekly areas "+\
  43. "according to the number of days of a map week falling in the given month."
  44. ;=============================================

  45. ;=====calculate monthly from weekly===========
  46. wi=nn  ;weekly start index
  47. do i=0,months-1
  48.     md(2)=where(isleapyear(y),29,28)
  49.     nn=(md(m)-(7-rn))/7
  50.     rn2=md(m)-nn*7-(7-rn)
  51.     temp=(7-rn)*1.0/md(m)*var(wi,:,:) ;week start of a month
  52.     temp=temp+dim_sum_n(var(wi+1:wi+nn,:,:),0)*7.0/md(m) ;week middle
  53.     wi=wi+nn+1
  54.     temp=temp+rn2*1.0/md(m)*var(wi,:,:)  ;week end
  55.     m_var(i,:,:)=temp
  56.     m=m+1
  57.     y=where(m.gt.12,y+1,y)
  58.     m=where(m.gt.12,m-12,m)
  59.     rn=rn2
  60. ;    print("y="+y+" m="+m+" md2="+md(2)+" nn="+nn+" rn="+rn+" wi="+wi)
  61. end do
  62. ;=============================================

  63. ;=====Coordinations===========================
  64. m_var!0="MyTime"
  65. m_var&MyTime=MyTime
  66. ;=============================================
复制代码

    检验下结果: (右图为网站提供的月平均积雪覆盖,左图为由weekly资料计算得到的月平均积雪覆盖)


200402

200402

201412

201412

197708

197708

weakly_to_monthly.ncl

3.63 KB, 阅读权限: 10, 下载次数: 46, 下载积分: 金钱 -5

评分

参与人数 1金钱 +15 贡献 +2 体力 +200 收起 理由
兰溪之水 + 15 + 2 + 200

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-15 22:11:54 | 显示全部楼层
nice~给楼主32个赞之后marl学习一下!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-16 13:45:08 | 显示全部楼层
是好方法,我对楼主所说的权重的理解是把weekly的值先转化成日值,作为可以度量月的基本单位,然后转化成月值。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-16 14:55:15 | 显示全部楼层
沙颖凯 发表于 2015-1-16 13:45
是好方法,我对楼主所说的权重的理解是把weekly的值先转化成日值,作为可以度量月的基本单位,然后转化成月 ...

确实如此。处理的时候是将日值用周值表示出来。
从网站上给出的信息来看,weekly数据是从daily数值平均后得到的,所以反过来用weekly数值代表每天的数据也是可取的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-16 14:59:01 | 显示全部楼层
程序编写的时候让我头疼的主要是第一个月和最后一个月的处理,还有构建YYYYMM这样的时间格式MyTime数组。细节需要调试,可能程序对某些情况还有疏忽,希望对同样想把weekly数据处理成monthly数据的朋友有所帮助
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-21 10:30:22 | 显示全部楼层
留名,感谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-21 10:36:06 | 显示全部楼层
发邮件问他们要  是可以得到月平均的   没必要自己处理
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-23 11:27:26 | 显示全部楼层
gxlbxzx 发表于 2015-1-21 10:36
发邮件问他们要  是可以得到月平均的   没必要自己处理

果然如此么。。当时也想发邮件来着,后来懒得弄,看处理方式不难,就自己编了一个-0-
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-24 21:13:14 | 显示全部楼层
批量拆分txt格式的气象数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-24 10:11:32 | 显示全部楼层
感谢分享,太赞了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表