爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3167|回复: 1

[混合编程] IDL编程学习之时间轴处理案例

[复制链接]

新浪微博达人勋

发表于 2018-5-21 15:12:49 | 显示全部楼层 |阅读模式

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

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

x
IDL时间轴我以前一直没用过,上周处理了一个文件,掌握了处理方法,原来只需要使用Julday(月,日,年,时,分,秒)即可,该函数的返回值是儒略日时间。
附件中的数据格式是:从上往下是高度层,从左往右是时间,中间的是某大气污染物浓度值,分隔符为“,”
把第一行与其他部分分开读入:
  a=read_ascii('C:\Users\YGDY\Desktop\nj20160822-28.txt',$
  header=head,DELIMITER=',',data_start=1)
  help,a
  help,head

输出:
** Structure <12119570>, 1 tags, length=2909580, data length=2909580, refs=1:
   FIELD001        FLOAT     Array[683, 1065]
HEAD            STRING    = Array[1]

观察数据,发现以逗号分隔后最后一列是无效的
QQ截图20180521142659.jpg
这时我们把除了第一列(高度)和最后一列的数据拿出来:
t=a.field001
x=t[1:-2,*]

切掉“Height”文字的字符串放入head2,head2以","分隔放入head3,将head3的尾部空格去除放入head3,这样每列的时间就抽离出来了:
head_number=STRLEN(head)
head2=strmid(head,11,HEAD_NUMBER)
HEAD3=strsplit(HEAD2,',',/extract)
head3=strtrim(head3,0)

检查下一致性:
help,x,head3
help,head3[-1]
print,n_elements(head3[-1])

输出:
X               FLOAT     = Array[681, 1065]
HEAD3           STRING    = Array[682]
<Expression>    STRING    = ''
           1

发现head3多处一列,即无效的最后一列。
删除之:
;如果最后一个是空,即分号后面没有字符串,就把这一元素剔除掉
if(strlen(HEAD3[-1]) eq 0)then begin
  head3=head3[0:-2]
  endif

抽离出每一时间列中的年月日时分秒,这个拿数组直接算,不要循环
year=strmid(head3,1,4)
month=strmid(head3,6,2)
day=strmid(head3,9,2)
hour=strmid(head3,12,2)
minute=strmid(head3,15,2)
second=strmid(head3,18,2)

写成儒略日格式:
time=julday(month,day,year,hour,minute,second)
对将进行的contour绘图进行x、y、z的维度检查:
  help,x,transpose(t[0,*]),time
X               FLOAT     = Array[681, 1065]
<Expression>    FLOAT     = Array[1065]
TIME            DOUBLE    = Array[681]

符合!
transpose函数把一个[1,N]的数组转换成一个[N]的向量,在调用contour时便不会报错
专家说污染物数值大于200不合理,则把超过200的都改为0:
  p=where(x gt 200)
  x[p]=0

绘图,横轴格式为:年(CYI)月(CMOI)日(CDI)时(CHI)分(CMI)秒(CSI),
其中,Y=year,MO=month,D=day,H=hour,M=minute,S=second
  fig=contour(x,time,transpose(t[0,*]),rgb_table=13,yrange=[0,0.5],$
    /fill,XTICKFORMAT='(C(CYI,"\",CMOi,"\",CDI,"-",CHI,":",CMI,":",CSI))')

更详细点:
C()时间输出操作

用于输出日期数据。
语法[n]C([c0,c1,...,cx]) 输入时默认格式
C(CDwA, X, CMoA, X, CDI, X, CHI, X, CMI, X, CSI, CYI5)
输出时默认格式
C(CDwA, X, CMoA, X, CDI2.2, X, CHI2.2, ":", CMI2.2, ":", CSI2.2,CYI5)
看着挺复杂吧,其实挺加到你看我慢慢解释
CMOA 字符月,想输出月的时候就用它
CMOI 数字月,想输出月的时候就用它
CDI天,想输出天的时候就用它
CYI年,想输出年的时候就用它
CHI时,想输出时的时候就用它
CMI分,想输出分的时候就用它
CSI秒,想输出秒的时候就用它
CSF带小数点的秒,想输出秒的时候就用它
CDWA,想输出周的时候就用它。有CDWA CdWA CdwA 三种写法,输出结果大小写不一样:
CAPA,想输出(上午下午)的时候就用它。有CAPA CaPA CapA,输出结果大小写不一样:

引用于:http://blog.sina.com.cn/s/blog_6787163301012trw.html
最后想想,并不是很难,
为什么困扰依旧的时间轴问题,只有在别人问我的时候才能解决?

nj20160822-28.txt

7.94 MB, 下载次数: 2, 下载积分: 金钱 -5

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

新浪微博达人勋

 楼主| 发表于 2018-5-21 15:29:00 | 显示全部楼层
画出图后观察,发现时间轴空白了一大块,
QQ截图20180521151547.jpg
检查原始数据发现,8月21日只有一列数据,而时间轴却从8月21日0时开始,那么时间轴需要用xrange调整;
高度也限制在2km以下吧,时间只要月日时:
QQ截图20180521152754.jpg

程序见附件

chick.pro

1.17 KB, 下载次数: 5, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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