CDO条件性选择数据

2020-04-21 17:26:28 浏览数 (1)

除了之前提到的选择操作符之外,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中提供了两个均值计算操作符:meanaveragemean是按照统计函数的方式计算均值,即排除缺省值的影响average通过求样本总和然后除样本总数,并未排除缺省值的影响。如果样本中不包含缺省值的话,meanaverage的计算结果相同。

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 中选择数据,否则为 缺省值。

根据常数进行条件选择

当然,也可以使用 ifthencifnotthenc 操作符 和常数进行比较,然后选择数据。

使用方法和 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数据集。

利用好自定义掩膜操作符可以非常方便的进行文件操作,尤其是当需要进行批量操作的时候。

0 人点赞