NCO是目前最强大的处理netCDF文件(包括由netCDF API创建的HDF5文件)的命令行工具,没有之一。NCAR开发NCO起初是为了处理分析GCM(General Circulation Models)数据集,即网格化科学数据集。
随着NCO的开发迭代,其功能也越来越强大。比如简单的算术运算(加、减、乘、除、广播)、插值、统计、数据合并等等。而且针对变量和属性,NCO提供了大量的命令可以编辑变量和属性信息,比如属性和变量重命名、变量和属性值更改\添加、缺失值处理等。
NCO可以跨平台运行,没有系统依赖问题。支持多线程并行操作,提高了运算效率。
安装
通过源码安装NCO可能会出现不少问题,简单直接的安装方式是通过Anaconda提供的conda包管理环境进行安装,安装命令如下:
conda install -c conda-forge nco
命令概览
NCO中包含了很多功能强大且非常实用的命令,下面是NCO中一些命令的简单介绍:
ncap2可以说是NCO中最强大的命令,具有相对完整的编程语言的全部特征,包括循环、条件、数组和数学函数。因为其功能强大,NCO每次更新时几乎都会随着更新,其文档也并不完善。在NCO发行文件data/ncap2_tst.nco中可以查到更为详细的描述,data/*.nco文件中包含了更详细的使用方法。
ncap2表达式支持基本的算术操作 (+、-、*、/、^)、 二元操作 (>、>=、<、<=、==、!=、||、&&、>>、<<)、 赋值操作 、 条件表达式 (exp1 ? exp2 : exp3)等, 条件判断语句 、 字符串方法 、 数组控制语句 等。语法形式类似C语言。
ncatted可以快速直接的编辑netCDF文件属性,包括添加、创建、删除、更改和重写属性。ncatted可以批量更改文件中所有变量属性,但每次操作NCO都会添加操作命令到history全局属性,从而增加history属性的大小。
注意:使用ncatted更改缺失值_FillValue属性时要注意,防止在不同机器操作时,因为浮点精度问题导致兼容性问题。
ncbo可以对两个文件执行算术运算,将结果存储到第三个文件。支持+、-、*、/ 四种算术操作。ncbo仅对浮点型变量有效,对坐标变量(保证坐标变量具有物理含义,比如longitude和latitude坐标)和NC_CHAR/NC_STRING类型变量无效。
ncclimo主要是对netCDF文件进行气候方面的操作。可以实现的功能很多。
ncecat可以将任意netCDF输入文件合并为单个文件。有两种合并方式:RAG(Record AGgregation),即记录合并,将所有输入文件中的记录合并为连续记录到输出文件;GAG(Group AGgregation),即组合并,将所有输入文件按照组的形式输出到netCDF4文件中。
nces对所有输入文件/每个文件中的输入组进行变量的格点统计。nces有两种工作模式:文件集合和组集合。文件集合是对所有输入文件进行变量的格点统计,组集合是对文件中的变量进行格点统计。
ncflint根据输入文件进行线性组合得到输出文件,例如对输入文件进行插值、加权平均或归一化加权平均。坐标变量仅直接拷贝,不进行上述操作。通常有两种方式执行上述操作:
•指定权重:1) 加权平均:给定file1的权重wgt1,则file2的权重可以直接通过1 - wgt1得到。如果给定权重大于1,那么需要同时给定两个权重,比如wgt1=2,wgt2=-3。2) 归一化加权平均:对给定的权重进行归一化,比如wgt1 = wgt1/(wgt1 + wgt2),wgt2 = wgt2/(wgt1 + wgt2)。如果未给定权重值,则默认权重值相同。•插值:和指定权重的方式不同,插值方法是根据给定的输入文件的变量信息,采用线性插值的方式得到输出结果。
上述操作对坐标变量和字符变量无效。
ncks可以说是NCO中处理netCDF文件的又一神器(毕竟是厨房神器),是最长使用的命令之一。
ncks可以完成ncdump和nccopy的大部分功能,同时还可以实现文件的提取、分割等操作,还可以根据给定的网格文件对数据进行插值。
此外还可以以ASCII、CDL、JSON等格式输出netCDF文件信息。
ncpdq具有两个功能:数据打包和维度排列。如果未指定-a选项,ncpdq默认执行数据打包操作。
ncra对一系列输入文件中的记录变量进行统计计算,比如计算均值。进行统计计算时也可以给定权重信息,进行加权平均。
合并一些列输入文件的记录变量。默认情况下,最终的记录维度长度是输入文件所有记录维度长度之和。ncrcat可以从标准输入接受大量文件。
输入文件的大小可以是多变的,但是每个文件必须要有一个记录维度。记录坐标应该是单调的。
ncrcat无法解包数据,只能简单的从输入文件拷贝数据和元数据到输出文件。这意味着对于所有输入文件的给定变量而言,使用打包规则压缩的数据必须使用相同的打包参数(即scale_factor和add_offset),否则连接后数据集无法正确解包。
ncremap是在NCO V4.5.4引入的新工具,可以将输入文件中的数据重新插值到map_fl、grd_dst或dst_fl选项给定的网格,并输出。ncremap可以使用NCO原生算法进行插值,也可以借助ESMF的ESMF_RegridWeightGen等函数。其主要应用是进行不同网格投影的数据插值变换,比如将WRF模式Lambert投影结果插值到lat-lon投影,或者是对不同模式的网格化结果进行插值变换。
ncrename可以重命名netCDF维度,变量,属性和组。每个对象都有一个旧名称和新名称。所有的新名称必须是独一无二的。每一个旧名称必须存在于输入文件中,除非旧名称之前以 . 开头。在重命名之前,不会检查旧名称是否存在。因此,如果旧名称没有以 . 开头,当旧名称不存在时,ncrename将终止重命名。. 表示旧名称存在与否是可选的,如果存在就替换,不存在就跳过。新名称不应以 . 开头。
ncwa可以对单个输入文件中任意维度的变量执行统计计算,可以给定权重、掩膜信息或归一化。
NCO提供的上述命令几乎涵盖了平时对netCDF处理的方方面面,可以说是处理netCDF最强大的工具,最大的缺点就是无法执行可视化操作。
NCO也提供了Python的封装版本[1],但功能可能没有直接使用NCO命令行工具强大,感兴趣的可以直接查看github链接。
除了NCO之外,还有一个用于处理netCDF文件的命令行工具--CDO,也有对应的Python封装版本,感兴趣的可以查看。
此次仅对上述命令进行简要介绍,下次再详细介绍常用命令的使用方法。