之前说了如何利用CDO查看数据集信息 使用CDO查看气象数据信息。这一次说一下利用CDO从数据集中提取数据。这部分是非常使用的,尤其是当涉及到大数据集的时候,其优势就变得非常明显了。
从事气候和区域模式工作的都会明白,模式输出结果有时会非常大,动辄就是几十甚至几百G,而其中有很多变量是我们用不到的,这时候为了方便就需要把需要用到的变量提起出来。
比如,要提取某些时刻,某些变量在局部区域的数据:
cdo -sellonlatbox,119.5,120.5,33.5,34.5 -selname,SCW,SCI,SCS,SCH,SCHL,SCR,SCTOT,REFL_10CM -seltimestep,1,7,13,19,24 wrfout_d03_2016-06-23_06\:00\:00 wrfsub.nc
# sellonlatbox 表示按照经纬度范围选择区域,先经度范围,后纬度范围
# selname 表示按照变量名选择数据,直接跟变量名,用,号隔开
# seltimestep 表示按照时步选择数据,数字分别表示第几个时步,均用,号隔开
# wrfout_d03_2016-06-23_06:00:00 输入文件
# wrfsub.nc 输出文件名
上述命令表示先从输入文件中选取第1,7,13,19,24个时步的所有变量,然后从所得的结果中选择指定的八个变量,然后再从得到的结果中选择指定经纬度范围的数据,最后输出到指定文件。
注意:每个操作符前都有 - 符号,这是使用操作符链时的标配,而且操作符链的运算顺序是从右往左。
执行输出信息如下:
cdo sellonlatbox: Started child process "selvar,SCW,SCI,SCS,SCH,SCHL,SCR,SCTOT,REFL_10CM -seltimestep,1,7,13,19,24 wrfout_d03_2016-06-23_06:00:00 (pipe1.1)".
cdo(2) selname: Started child process "seltimestep,1,7,13,19,24 wrfout_d03_2016-06-23_06:00:00 (pipe2.1)".
cdo(3) seltimestep: Processed 3829668565 values from 175 variables over 25 timesteps ( 23.72s )
cdo(2) selname: Processed 640938240 values from 175 variables over 5 timesteps ( 23.79s )
cdo sellonlatbox: Processed 640938240 values from 8 variables over 5 timesteps ( 24.10s )
从输出信息中可以看出,总耗时在1min左右,查看输出文件信息可以看到,输出文件大小为98M,而之前的输入文件大小为206G!数据集大小变化超过2000倍,这在进行数据共享时对于效率的提高是非常重要的!
-rw-r--r-- 1 xxxxx xxxxx 98M wrfsub.nc
除了上述选择方式之外,还有很多选择数据的方式,比如选择指定压力层,根据模拟域的索引选择,根据时间,年,月,日等,而且还可以根据网格单元选择数据。当然了,除了选择部分数据之外,也可以从数据集中删除数据。
选择字段
select 操作符可以从任意数量的输入文件中提取指定的信息,并输出到指定文件中。所选择的字段取决于选择的参数,而参数是通过逗号分割的“key=value”对。通配符也可用作字符串参数(即可以通过正则表达式匹配选择)。
常用形式为:
cdo select,param infiles outfile
其中param可以是变量名,参数ID,编码,垂直层,日期,时刻,网格名,时步等。具体信息可以查看help。这个操作符是低级命令,适用于批量操作。其对应delete操作符,可以从输入文件删除数据。
比如:
从两个文件中选择500,850hPa的U,V,W变量数据
cdo select,name=U,V,W,level=500,850 wrfout_d03_2016-06-23_00:00:00 wrfout_d03_2016-06-23_06:00:00 wrfsub.nc
注意:每个文件的不同时步都要包含相同的变量。
除了使用上述方式选择之外,还可以通过 slevar类操作符选择数据,selvar操作符提供了很多可选参数用于操作数据集。
比如常用的操作符:
selname/delname 根据变量名选择/删除数据,可指定多个变量名,用逗号隔开即可
sellevel 选择指定层的数据,可指定压力层
GRIB参数多字段选择
selmulti 操作符可以从输入文件中选择多个字段然后输出到文件中。常用形式如下:
cdo selmulti,selection-specification infile outfile
selection-specification可以是文件名或字符串。如果是字符串的话需满足如下形式:
<type>(parameters; leveltype(s); levels)
type 表示是选择还是删除即 sel 或 del
parameters 表示参数编码
leveltype 表示GRIB1层类型
levels 每一层的值
比如:
( 1 1 , 1 7 ; 1 0 5; 2 )
下列描述方式也可从文件中选择数据:
SELECT/DELETE, PARAMETER=parameters, LEVTYPE=leveltye(s), LEVEL=levels
使用以下操作可以转换压力单位和温度单位:
SELECT, PARAMETER=1, LEVTYPE= 1 0 3 , LEVEL=0, SCALE=0.01 SELECT, PARAMETER=11, LEVTYPE=105, LEVEL=2, OFFSET=273.15
注意:如果定义了SCALE和OFFSET的话,文件中数据会进行换算:SCALE×(VALUE - OFFSET)。默认SCALE为1,OFFSET为0。
针对多字段操作,除了selmulti操作符之外,还有对应的删除操作delmulti和改变操作符changemulti。
选择单元格及重采样
选择单元格的操作并不经常使用,主要是使用selgridcell和delgridcell操作符,而且通过单元格索引进行数据集操作。使用方式如下:
cdo sel/delgridcell,indexs infile outfile
主要说一下重采样吧,所谓的重采样就是对水平网格精度的改变。默认的参数值为2,即网格精度会变为原来的一半。使用方式如下:
cdo samplegrid,factor infile outfile
下面是关于数据集选取的所有操作符,简单了解其功能,需要时合理选择。
select 选择字段
delete 删除字段
selmulti 选择多个字段
delmulti 删除多个字段
changemulti 改变多个字段的ID
selparam 通过ID选择参数
delparam 通过ID删除参数
selcode 通过编码选择参数
delcode 通过编码删除参数
selname 通过变量名选择参数
delname 通过变量名删除参数
selstdname 通过标准名选择参数
sellevel 选择层
sellevidx 通过索引选择层
selgrid 选择网格
selzaxis 选择z轴
selzaxisname 通过名称选择z轴
seltype 选择GRIB层类型
seltabnum 选择表数参数
seltimestep 选择时步
seltime 选择时刻
selhour 选择小时
selday 选择天
selmonth 选择月
selyear 选择年
selseason 选择季
seldate 选择日期
selmon 选择单个月
sellonlatbox 选择经纬度范围
selindexbox 选择索引范围
selgridcell 选择网格单元
delgridcell 删除网格单元
samplegrid 重采样网格