如果你想使用cdo
,不需要所有这些循环和编写大量文件,只需使用函数deltat
:
cdo deltat in.nc diff.nc
与 python 解决方案一样,这将比您使用的循环快几个数量级,并且具有作为命令行单行器的优势。
或者,不那么简洁,如果你知道长度,你可以区分这两个系列(我展示了这一点,因为这种技术在其他情况下很有用):
# calculate number of steps in the file:
nstep=$(cdo -s ntime in.nc)
# do difference between steps 2:n and steps 1:(n-1)
cdo sub -seltimestep,2/$nstep in.nc -seltimestep,1/`expr $nstep - 1` in.nc diff.nc
关于累积字段的后记!
请注意,上述解决方案和此页面上发布的两个 python 解决方案都会产生一个比输入少一个时间步的输出,即他们扔掉第一个时间步。在某些情况下,例如,如果您有一个在预测中累积的模型通量场,似乎是这种情况,您不想丢弃第一个时间步长(因为这是从预测开始时从零到第一步)。在这种情况下,您可以提取第一步并将其插入文件的“前面”,如下所示:
cdo mergetime -seltimestep,1 in.nc diff.nc diff_with_step1.nc
您还应该确保对 python 解决方案也这样做。
您可以将整个事情作为一个单线器进行管道传输(有时管道可能会导致总线错误或段错误,这些通常可以使用“-L”选项来纠正以强制执行顺序操作)。
cdo mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
如果您遇到段错误,请尝试此操作
cdo -L mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
如果您有打包数据(即类型 NC_SHORT),这是为了防止舍入和准确性问题:
cdo -L -b f32 mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc