前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CDO条件性选择数据

CDO条件性选择数据

作者头像
bugsuse
发布2020-04-21 17:26:28
3.1K0
发布2020-04-21 17:26:28
举报
文章被收录于专栏:气象杂货铺气象杂货铺

除了之前提到的选择操作符之外,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数据集。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档