<p>如果要使用<code>cdo</code>,不需要所有这些循环和编写大量文件,只需使用函数<code>deltat</code>:</p>
<pre><code>cdo deltat in.nc diff.nc
</code></pre>
<p>与python解决方案一样,这将比您使用的循环快几个数量级,并且具有作为命令行单行程序的优势</p>
<p>或者,更不简洁的是,如果您知道长度,您可以将这两个系列区别开来(我展示了这一点,因为这种技术在其他上下文中可能很有用):</p>
<pre><code># 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
</code></pre>
<p><strong>累积字段上的Postscript</强>
请注意,上面的解决方案和本页上发布的两个python解决方案产生的输出比输入少一个timestep,<strong>,即它们丢弃了第一个timestep</strong>。在某些情况下,例如,如果有一个模型通量场在预测中累积(似乎是这样),则不希望放弃第一个时间步(因为这是从预测开始时的零到第一步的累积)。在这种情况下,您可以提取第一步并将其插入文件的“前面”,如下所示:</p>
<pre><code>cdo mergetime -seltimestep,1 in.nc diff.nc diff_with_step1.nc
</code></pre>
<p>您还应该确保对python解决方案也这样做</p>
<p>您可以将整个过程作为一个管道(有时管道可能会导致总线错误或seg故障,通常可以使用“-L”选项来执行顺序操作)</p>
<pre><code>cdo mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
</code></pre>
<p>如果你有seg故障,试试这个</p>
<pre><code>cdo -L mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
</code></pre>
<p>这是为了防止舍入和准确性问题,如果您有压缩数据(即键入NC_SHORT):</p>
<pre><code>cdo -L -b f32 mergetime -seltimestep,1 in.nc -deltat in.nc diff_with_step1.nc
</code></pre>