【问题标题】:add a new variable to a netcdf file that increases with time向随时间增加的 netcdf 文件添加新变量
【发布时间】:2020-04-06 12:19:09
【问题描述】:
我想在现有的 netcdf 文件中添加一个新变量,该变量简单地随文件的时间变量线性增加,也就是说,在第一个时间片上,变量到处都有数字 1,在第二个时间片上它是设置为 2 等。
我知道如何在 python 或 fortran 中打开文件并定义和添加变量并写出修改后的文件,但我希望可能有一种快速简便的方法可以使用 nco 或 cdo。我还想知道是否可以通过使用 ncdump 将文件转储为 CDL 格式、破解它并使用 ncgen 将其转回 netcdf 来做到这一点,但这似乎更冗长且有问题比python方法。
【问题讨论】:
标签:
netcdf
cdo-climate
nco
【解决方案1】:
对于一维数组使用这个
ncap2 -s 'var=array(1,1,$time)' in.nc out.nc
对于多维数组,只需将其添加到零数组中
ncap2 -s 'var=array(0,0,/$time,$lat,$lon/)+array(1,1,$time)' in.nc out.nc
数组的数值类型由数组函数的第一个参数的类型决定。详情请参阅array() 上的manual。
【解决方案2】:
我刚刚发现(询问两年后!)还有一个cdo 函数seq 可以产生递增的时间序列。生成的文件是针对单点的,因此您需要 enlarge 字段以匹配目标网格,最后 merge 与原始文件:
# in the follow $n is the number of timeslices in in.nc
cdo -f nc4 seq,1,$n seq.nc
cdo enlarge,in.nc seq.nc seq2d.nc # enlarge to in.nc grid
cdo merge in.nc seq2d.nc out.nc # and merge
您可以通过以下方式将这一切通过管道传输到一个命令中:
cdo merge in.nc -enlarge,in.nc -seq,1,$n out.nc
nco 解决方案很棒,但我想我可能会觉得这更容易记住。