登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
费了几天劲,终于灵光一现,写出了一个处理数据的简单脚本。
原始数据如下,可见是每分钟一个数,但经常有缺测,一缺缺几十分钟到几小时,很难用常规的方法来计算其小时平均浓度:
Excel整理一下,删掉几列,再转为csv格式如下
begin data = asciiread("honohhmm.csv",-1,"string") data = str_sub_str(data,","," ") data = str_sub_str(data,":"," ") hono = stringtofloat(str_get_field(data,6," ")) minute = stringtofloat(str_get_field(data,5," ")) hh = stringtofloat(str_get_field(data,4," ")) mm = stringtofloat(str_get_field(data,2," ")) yy = stringtofloat(str_get_field(data,1," ")) M = 1055 N = 3 honoday=new((/M,N/),float) honoday(:,0) = hh(0:M-1) honoday(:,1) = minute(0:M-1) honoday(:,2) = hono(0:M-1) honohrmean=new(24,float) clock=new(24,float) honohr=new(M,float) 在NCL中通过asciiread()函数读取文本文档为string后,将其中的“,”,“:” 都换成空格“ ”,并分别根据年月日时分及浓度属性,分割提取6列数据。定义一个新的数组,将小时及浓度等数据赋值过去,再定义一个一维数组用于接收随后的观测浓度数据,定义若干其他数组,用于存储最终结果。
好戏来了,下面的这个循环实现了对落在某一小时区间的所有观测浓度求平均的功能。连用两次where,第一次where先找出落在某一小时内的所有数据,并将目标数据与其余数据取绝对值后强制取正负加以区分,再将已正负区分的数据赋值给honohr这个一维数组,第二次where通过判断这个一维数组中的数据是否>0,倘若符合,则保持不变,倘若不符合,则用无效值强制替换,再对这个一维数组进行求平均,无效值不参与计算,故轻松实现了每一小时观测浓度的平均。 do it = 0,23,1 a = it b = it+1 honoday(:,2)= where(honoday(:,0).ge.a .and. \ honoday(:,0).lt.b ,abs(honoday(:,2)),-1*abs(honoday(:,2))) honohr = honoday(:,2) honohr = where(honohr.gt.0, honohr,honohr@_FillValue) honohrmean(it) = avg(honohr)
clock(it) = it end do 至此,计算工作已完成,再定义一个二维数组,将小时及对应的平均浓度写入,文件名为hr_mean,文件标题为cols:hh,HONO,共两列,每列占用十小格,浮点型,小数点后保留四位。
print(honohrmean) y = new((/24,2/),float) y(:,0)=clock y(:,1)=honohrmean
opt=True opt@row=True opt@title = "cols:hh,HONO" opt@fout ="hr_mean" fmtx="2f10.4" write_matrix(y,fmtx,opt)
end |