2016-12-20 13 views
0

У меня есть netcdf-файл, содержащий около 100 временных меток на сетке с одной переменной, которая накапливается по времени. Теперь я заинтересован в вычислении вклада каждого временного значения в значение переменной (т. Е. Разность последовательных временных меток).Лучшая дисперсия накопленных временных задержек netcdf с CDO

В настоящее время я использую следующую последовательность:

  1. Чтобы извлечь каждые временный шаг в новый файл я использую cdo seltimestep,$i ...,
  2. вычисления каждой разность в новый файл с cdo sub $i ${i-1} ...
  3. и объединить эти новые файлы в конце с cdo mergetime ... в один файл результата.

Это кажется мне очень громоздким и не идеальным в отношении производительности. Из-за количества timesteps я не могу использовать конвейер cdo и вам нужно создать много файлов за это время.

Есть один лучше подходит для разгона накопленных переменного с CDO (или что-то другое, как NCO/NCL?)

+0

Вас интересуют только '' cdo' решения? У меня есть 1-лайнер в Python, который сделает это за вас. – jhamman

+0

@jhamman Мне очень интересно видеть этот 1-лайнер, я не ограничиваюсь 'cdo' –

ответ

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() 
+0

Есть ли простой способ перезаписать старые значения в существующем файле или записать новые значения в копию файла? Я никогда не работал с Python NetCDF4 раньше ... –

+0

Спасибо, что указали на 'variable' typo - исправлено! И я обновил свой ответ, чтобы показать, как записать новую переменную в новый файл netcdf. Для получения дополнительных примеров ознакомьтесь с документами здесь: http://unidata.github.io/netcdf4-python/ – N1B4

+0

Я впечатлен тем, насколько быстрее эта версия по сравнению с моим решением cdo –

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') 
+0

Мне нравится это решение, но по крайней мере для мой случай использования xarray медленнее по сравнению с numpy –