使用CDO

时间:2016-12-20 13:57:51

标签: bash performance netcdf hpc

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

目前我使用以下序列:

  1. 要将每个时间步长提取到新文件中,我使用cdo seltimestep,$i ...
  2. 使用cdo sub $i ${i-1} ...
  3. 将每个差异计算到一个新文件中
  4. 并将这些新文件与cdo mergetime ...合并到一个结果文件中。
  5. 在我看来,这对于表现而言非常麻烦且不理想。由于时间步长,我不能使用cdo管道,因此需要在此期间创建许多文件。

    是否有一个更好的解决方案来驱散cdo(或其他类似nco / ncl?)的累积变量

3 个答案:

答案 0 :(得分:1)

numpy's diff计算连续条目的差异。

我怀疑你的文件中有一个多维变量,所以这是一个如何做的通用示例:

import netCDF4
import numpy as np

ncfile = netCDF4.Dataset('./myfile.nc', 'r')
var = ncfile.variables['variable'][:,:,:] # [time x lat x lon]

# Differences with a step of 1 along the 'time' axis (0) 
var_diff = np.diff(var, n=1, axis=0) 
ncfile.close()

# Write out the new variable to a new file     
ntim, nlat, nlon = np.shape(var_diff)

ncfile_out = netCDF4.Dataset('./outfile.nc', 'w')
ncfile_out.createDimension('time', ntim)
ncfile_out.createDimension('lat', nlat)
ncfile_out.createDimension('lon', nlon)
var_out = ncfile_out.createVariable('variable', 'f4', ('time', 'lat', 'lon',))
var_out[:,:,:] = var_diff[:,:,:]
ncfile_out.close()

答案 1 :(得分:1)

xarray是我选择此类工具的工具:

import xarray as xr

# Open the netCDF file
ds = xr.open_dataset('./myfile.nc')

# Take the diff along the time dimension
ds['new_variable'] = ds['variable'].diff(dim='time')

# Write a new file
ds.to_netcdf('outfile.nc')

答案 2 :(得分:0)

如果您想要基于CDO的解决方案,则可以采用一种较短的方法来避免循环并写出很多文件:

file=your_file_name.nc # just to keep the code shorter in the following :-)

# calculate number of steps in the file:
nstep=`cdo -s ntime $file`

# do difference between steps 2:n and steps 1:(n-1)
cdo sub -seltimestep,2/$nstep $file -seltimestep,1/`expr $nstep - 1` $file  diff.nc

如果您不担心第一步,则可以在此处停止,否则需要将其提取并粘贴到文件的前面:

cdo mergetime -seltimestep,1 $file diff.nc output.nc 

尽管有点杂乱,但您仍可以尝试将整个管道作为一个管道输送(我确实发现过度雄心的管道输送会导致总线错误)!

cdo mergetime -seltimestep,1 $file -sub -seltimestep,2/$nstep $file -seltimestep,1/`expr $nstep - 1` $file output.nc