CDO简介及常用语法

Climate Data Operators (CDO) 是用来处理气候数据的软件,可以在linux环境下直接对数据文件进行处理,通过筛选,删除,修改等操作从原始数据文件中得到自己所需的资料格式,配合Python,NCL等语言的使用十分方便。

一、 CDO安装

仍然是推荐在CONDA环境下使用CDO,安装也十分的方便:

1
conda install -c conda-forge cdo

使用或者使用Ubuntu系统的安装指令也可:

1
apt-get install cdo

二、基本语法

CDO的使用很简单,基本语法只有一条:

1
cdo [ Options ] Operator1 [ -Operator2 [ -OperatorN ] ]

这么看起来还是麻烦,那么再简化就是:

1
cdo [ Options ] Operator

cdo起头,表明这是cdo语法,接一个Options表明一些参数选项(可选,无特殊需求可省略),接Operator 表明操作的行为(命令+数据文件)。

以下一些Options是针对所有Operator可用的(更多请见原文档):

  1. -a 生成一个绝对时间坐标 (适用于数据时间信息丢失时)
  2. -b 指定数据格式,可选:I8/I16/I32/F32/F64
  3. -f 设置输出文件格式(一般默认.nc结尾即可,所以该选项一般可忽略)

第二条可能最常用一些,比如报错信息包含数据精度问题时,指定 -b F64 即可。

三、多文件操作

3.1 连锁命令

连锁命令指的是用一条指令,对一个文件进行一系列处理,比如对一个文件,用一条命令实现提取冬半年数据,删除闰年2.29日,提取500hPa数据,提取北半球数据这四个操作。这就要求Operator1的输出文件可以作为Operator2的输入文件,形成一个链条。

个人还是不建议新手使用这种方式,容易出问题。

比如从u.nc和v.nc中提取500hPa数据,并拼接为一个文件时,完整的操作:

1
2
3
cdo sellevel,500 u.nc u500.nc
cdo sellevel,500 v.nc v500.nc
cdo merge u500.nc v500.nc 500.nc

利用连锁命令为:

1
cdo merge -sellevel,500 u.nc -sellevel,500 v.nc 500.nc

3.2 多文件操作

多文件操作指的是,比如说每年都有一个文件,想要将这些文件合成或者其他操作,通过*来代替字符。

比如,文件为1979.nc,1980.nc,1981.nc…2017.nc,将这些文件按时间合成,有两种办法

一种是:

1
cdo mergetime 1979.nc 1980.nc 1981.nc ..... 2017.nc 1979-2017.nc

…部分是需要完整填写的。

这样就很麻烦,可以用*代替:

1
cdo mergetime *.nc 1979-2017.nc

前提是该文件夹下仅有这些以.nc结尾的文件。

四、常用命令

4.1 对文件操作

命令(Operator) 作用 用法
cat 链接数据集 cdo cat infile1 infile2 infile3 outfile
mergegrid 合并从infile2到infile1的所有变量的网格点,并将结果写入outfile。
infile2的水平网格应该更小或等于infile1的网格,且分辨率必须相同。
只有直线网格是支持。
两个输入文件需要具有相同的变量和相同的时间步长。
cdo mergegrid infile1 infile2 outfile
merge 合并数据集 cdo merge infile1 infile2 infile3 outfile
mergetime 按时间合并数据集 cdo mergetime infile1 infile2 infile3
splitname 按变量名切片数据集 cdo infiles outfile
splitlevel 按高度层数切片数据集
splithour 按小时时间数切片数据集
splitday 按日期天切片数据集
splitseas 按季节切片数据集
splityear 按年切片数据集
splityearmon 按年和月切片数据集
splitmon 按月切片数据集

4.2 对文件选取

命令(Operator) 作用 用法
select 选择 cdo ,parameter infiles outfile
delete 删除 cdo ,parameter infiles outfile
selparam 选择变量
delparam 删除变量
selname 按变量名选择变量
delname 按变量名删除变量
sellevel 选择指定层数
sellevidx 按索引标号选择层数
selgrid 选择格点
seltimestep 选择时间步长
seltime 选择时间
selhour 选择小时
selday 选择天
selmonth 选择月
selyear 选择年
selseason 选择季节
seldate 选择日期
sellonlatbox 选择经纬度范围 sellonlatbox,西,东,南,北 infile outfile

这些的用法均是,parameter

parameter有以下选择:

Parameter 格式 填写规则
name string 逗号分隔的变量名列表
level float 逗号分隔的高度列表
date string 逗号分隔的日期列表,格式YYYY-MM-DDThh:mm:ss
startdate string 起始日期,格式YYYY-MM-DDThh:mm:ss
enddate string 结束日期,格式YYYY-MM-DDThh:mm:ss
hour integer 逗号分隔的小时
day integer 逗号分隔的天
month integer 逗号分隔的月
season srting 逗号分隔的季节(DJFMAMJJASOND的子字符串)
year integer 逗号分隔的年
timestep integer 逗号分隔的时间步长

比如,删除一个数据文件中所有的2月29号的数据:

1
cdo delete,month=2,day=29  input.nc output.nc

4.3 插值

命令(Operator) 作用 用法
remapbil 线性插值 cdo remapbil,grid infile outfile

CDO提供的插值有很多,这里我只简单的介绍一种线性插值,常用于讲粗(细)网格插值到另一种分辨率的细(粗)网格。grid指的是格点的描述名或者描述文件。

比如从1°×1°的数据,插值到2.5°×2.5°的数据。

1
cdo remapbil,r144x73  input.nc output.nc

r144x73指的便是经度144点,纬度73点的标准2.5°×2.5°的网格。