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可用的(更多请见原文档):
- -a 生成一个绝对时间坐标 (适用于数据时间信息丢失时)
- -b
指定数据格式, 可选:I8/I16/I32/F32/F64 - -f
设置输出文件格式(一般默认.nc结尾即可,所以该选项一般可忽略)
第二条可能最常用一些,比如报错信息包含数据精度问题时,指定 -b F64 即可。
三、多文件操作
3.1 连锁命令
连锁命令指的是用一条指令,对一个文件进行一系列处理,比如对一个文件,用一条命令实现提取冬半年数据,删除闰年2.29日,提取500hPa数据,提取北半球数据这四个操作。这就要求Operator1的输出文件可以作为Operator2的输入文件,形成一个链条。
个人还是不建议新手使用这种方式,容易出问题。
比如从u.nc和v.nc中提取500hPa数据,并拼接为一个文件时,完整的操作:
1 | cdo sellevel,500 u.nc u500.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 |
splitlevel | 按高度层数切片数据集 | |
splithour | 按小时时间数切片数据集 | |
splitday | 按日期天切片数据集 | |
splitseas | 按季节切片数据集 | |
splityear | 按年切片数据集 | |
splityearmon | 按年和月切片数据集 | |
splitmon | 按月切片数据集 |
4.2 对文件选取
命令(Operator) | 作用 | 用法 |
---|---|---|
select | 选择 | cdo |
delete | 删除 | cdo |
selparam | 选择变量 | |
delparam | 删除变量 | |
selname | 按变量名选择变量 | |
delname | 按变量名删除变量 | |
sellevel | 选择指定层数 | |
sellevidx | 按索引标号选择层数 | |
selgrid | 选择格点 | |
seltimestep | 选择时间步长 | |
seltime | 选择时间 | |
selhour | 选择小时 | |
selday | 选择天 | |
selmonth | 选择月 | |
selyear | 选择年 | |
selseason | 选择季节 | |
seldate | 选择日期 | |
sellonlatbox | 选择经纬度范围 | sellonlatbox,西,东,南,北 infile outfile |
这些的用法均是
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°的网格。