使用 CDO 将累积变量转换为 netcdf 文件中的时间步值

Jan*_* S. 2 python netcdf nco cdo-climate

我有一个 netcdf 文件,网格上有大约 100 个时间步长,其中有一个变量,该变量是在时间步长上累积的。我现在有兴趣计算每个时间步长对变量值的贡献(即连续时间步长的差异)。

目前我使用以下顺序:

  1. 为了将每个时间步提取到我使用的新文件中cdo seltimestep,$i ...
  2. 将每个差异计算到一个新文件中cdo sub $i ${i-1} ...
  3. 并将这些新文件最终合并cdo mergetime ...到一个结果文件中。

在我看来,这非常麻烦并且在性能方面并不理想。由于时间步长,我无法使用 cdo 管道,因此需要同时创建许多文件。

是否有一种更好的解决方案可以使用 cdo (或其他类似 nco/ncl 的东西?)将累积变量转换为时间步值?

Adr*_*ins 5

如果你想使用cdo,不需要所有这些循环和编写大量文件,只需使用该函数deltat

cdo deltat in.nc diff.nc 
Run Code Online (Sandbox Code Playgroud)

与 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
Run Code Online (Sandbox Code Playgroud)

后记积累领域! 请注意,上述两个解决方案以及本页上发布的两个 python 解决方案都会产生比输入少一个时间步的输出,即它们丢弃了第一个时间步。在某些情况下,例如,如果您有一个在预测中累积的模型通量场(似乎是这种情况),您不想丢弃第一个时间步长(因为这是从预测开始时的零到第一步)。在这种情况下,您可以提取第一步并将其插入到文件的“前面”,如下所示:

cdo mergetime -seltimestep,1 in.nc diff.nc diff_with_step1.nc 
Run Code Online (Sandbox Code Playgroud)

您还应该确保对 python 解决方案也执行此操作。

你可以将整个事情作为一个单行管道(有时管道可能会导致总线错误或段错误,这些通常可以使用“-L”选项来强制执行顺序操作来修复)。

cdo mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
Run Code Online (Sandbox Code Playgroud)

如果出现段错误,请尝试此操作

cdo -L mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
Run Code Online (Sandbox Code Playgroud)

如果您有打包数据(即类型 NC_SHORT),这是为了防止舍入和准确性问题:

cdo -L -b f32 mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
Run Code Online (Sandbox Code Playgroud)