除了之前提到的选择操作符之外,CDO还提供了一些条件选择操作符。这在针对从多个文件中进行条件选取的时候就显得非常方便了。
还是以NetCDF数据集为演示,在演示之前,为了方便操作,从原始数据集中仅提取出单个时步单个变量的某一层数据。
代码语言:javascript复制# 选择第1个时步,变量REFL_10CM,垂直层第10层的数据
cdo -sellevidx,10 -selname,REFL_10CM -seltimestep,1 wrfout_d02_2015-10-04_03:00:00 wrfoutsub_03.nc
cdo -sellevidx,10 -selname,REFL_10CM -seltimestep,1 wrfout_d02_2015-10-04_06:00:00 wrfoutsub_06.nc
使用 cdo info 查看数据集信息可以得到:
代码语言:javascript复制cdo info wrfoutsub_03.nc
-1 : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter ID
1 : 2015-10-04 03:00:00 10 177660 0 : 0.0000 6.8508 64.392 : -1
cdo info wrfoutsub_06.nc
-1 : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter ID
1 : 2015-10-04 06:00:00 10 177660 0 : 0.0000 7.4704 64.730 : -1
然后执行条件选择,以 wrfoutsub_03.nc 文件为参考:
代码语言:javascript复制cdo ifthen wrfoutsub_03.nc wrfoutsub_06.nc wrfoutsub.nc
然后查看输出文件信息:
代码语言:javascript复制cdo info wrfoutsub.nc
-1 : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter ID
1 : 2015-10-04 06:00:00 10 177660 122057 : 0.0000 16.600 64.730 : -1
Miss 列对应的值为 122057,而最大值为 64.730,最大值与 wrfoutsub_06.nc 的最大值相同,但是均值增大了。这就涉及到CDO的均值计算方法。
注:
CDO中提供了两个均值计算操作符:mean 和 average。mean是按照统计函数的方式计算均值,即排除缺省值的影响;average通过求样本总和然后除样本总数,并未排除缺省值的影响。如果样本中不包含缺省值的话,mean和average的计算结果相同。
IF THEN
ifthen 所执行的操作是:如果 wrfoutsub_03.nc文件中的变量值为0,那么相应的逻辑值为 false,如果不是0,那么对应的逻辑值为 true,然后根据变量的逻辑值从 wrfoutsub_06.nc中选择变量的对应数据。而 ifnotthen 执行相反操作。
一般操作方式为:
代码语言:javascript复制cdo ifthen infile1 infile2 outfile
# 即
# if infile1 != 0
# outfile = infile2
# elseif infile == 0
# outfile = miss
# 如果 infile1 中变量的值不等于0,输出文件中的变量值等于infile2中
# 的值,如果等于0的话,对应位置的值则为缺省值
用python对上述文件的信息进行验证,看是否如此。
代码语言:javascript复制In [1]: import netCDF4 as nc
In [2]: data1 = nc.Dataset("wrfoutsub_03.nc")
In [5]: ref1 = data1.variables["REFL_10CM"][0,0,:,:]
In [7]: data2 = nc.Dataset("wrfoutsub_06.nc")
In [8]: ref2 = data2.variables["REFL_10CM"][0,0,:,:]
In [9]: ref1.max()
Out[9]: 64.391907
In [10]: ref3 = ref2[ref1 != 0]
In [11]: ref3.shape
Out[11]: (55603,)
In [12]: ref3.max()
Out[12]: 64.730263
In [13]: ref3.mean()
Out[13]: 16.600458
In [14]: 420 * 423 - 55603
Out[14]: 122057
从上述结果中可以看到,ref3 与 ifthen 的输出结果是一致的(忽略精度的影响)。
注意:选择输出的文件中的元数据信息均为 infile2 文件中的元数据信息。
IF THEN ELSE
有 if then 怎么能缺 else 呢!
CDO同时提供了多字段条件选择操作符 ifthenelse。同样以 infile1为参考,然后从 infile2 和 infile3 文件中选择数据。看下图
如果 infile1 中的变量值不等于0,则从 infile2 文件中选择数据,如果 infile1 中的值等于0,则从 infile3 中选择数据,否则为 缺省值。
根据常数进行条件选择
当然,也可以使用 ifthenc 或 ifnotthenc 操作符 和常数进行比较,然后选择数据。
使用方法和 ifthen/ifnotthen 相同,只需要把 infile1 换为常数即可。
自定义掩膜
在条件选择操作符中,最重要的应该就是自定义掩膜操作符了。通过自定义掩膜操作,可以更方便的执行选择操作。
通用表达式:
代码语言:javascript复制reducegrid,mask[,limitCoordsOutput] infile outfile
# mask 表示掩膜文件
# limitCoordOutput 可选参数。用于控制坐标的输出
# "nobounds" 关闭坐标边界
# "nocoords" 不输出坐标信息
比如,可以利用地形文件来制作掩膜文件,从而实现条件选择。
利用地形文件选择海拔高度大于0的区域,并生成掩膜文件:
代码语言:javascript复制cdo -gtc,0 -topo,ni96 lsm_gme96.grb
# gtc 表示选择大于某个数的值
# topo 表示利用地形数据创建字段
利用生成的掩膜文件选取数据:
代码语言:javascript复制cdo -f nc reduce,lsm_gme96.grb temp_gme96.grb tempOnLand_gme96.nc
# -f 表示控制输出文件格式
注意:GRIB格式不能存储非结构网格数据,因此只能输出为 NetCDF数据集。
利用好自定义掩膜操作符可以非常方便的进行文件操作,尤其是当需要进行批量操作的时候。