Лучшая дисперсия накопленных временных интервалов netcdf с CDO
У меня есть netcdf-файл с примерно 100 временными шагами в сетке с одной переменной, которая накапливается за временные шаги. Теперь я заинтересован в расчете вклада каждого временного шага в значение переменной (т. Е. Разницу последовательных временных шагов).
В настоящее время я использую следующую последовательность:
- Чтобы извлечь каждый шаг в новый файл, который я использую
cdo seltimestep,$i ...
, - рассчитать каждую разницу в новый файл с
cdo sub $i ${i-1} ...
- и объединить эти новые файлы в конце
cdo mergetime ...
в один файл результатов.
Это кажется мне очень громоздким и не идеальным с точки зрения производительности. Из-за количества временных шагов я не могу использовать конвейер cdo, поэтому мне нужно создать много файлов.
Есть ли лучшее решение для распределения накопленной переменной с помощью cdo (или что-то еще, например, nco/ncl?)
2 ответа
Дифференциал numpy вычисляет разницу последовательных записей.
Я подозреваю, что в вашем файле есть многомерная переменная, так что вот общий пример того, как это сделать:
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()
Если вам нужно решение на основе 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
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')