NetCDF: вычитание временных шагов - PullRequest
0 голосов
/ 14 сентября 2018

У меня вопрос по поводу конкретных манипуляций с файлами netCDF.Я не уверен, как именно решить эту проблему.

У меня есть файл netCDF, который имеет 21 временной шаг и содержит данные толщины в переменной lithk.

. Я хотел бы вычестьпервый временной шаг от последнего, чтобы получить изменение толщины между первым и последним временным шагом.Затем я хотел бы добавить эти вновь рассчитанные данные обратно в файл netCDF в качестве новой переменной.Я перепробовал много решений и не смог найти то, что работает до сих пор.Я был бы очень признателен за любую помощь в этом.Большое спасибо

1 Ответ

0 голосов
/ 15 сентября 2018

Я могу предложить псевдорешение (вам, возможно, придется изменить это в соответствии с вашими потребностями) в Python и использовать модуль netCDF4, а также NumPy на всякий случай.

from netCDF4 import Dataset 
import numpy as np

Теперь я бы открыл файл netCDFв режиме записи:

ncin = Dataset(your_file_in, 'a');

Тогда я бы прочитал данные:

datain = ncin.variables['lithk'][:];ntime=np.size(datain);

Теперь мы можем вычислить изменение между первым и последним временным шагом:

valout = datain[0] - datain[-1]

Вы хотите записать новое значение в файл:

ncin.variables['lithk'][ntime+1:ntime+1] = valout;
ncin.close()

Осторожно, поскольку у меня нет ваших данных, а также я написал ответ без тестирования, возможно, вам придется изменить также переменную времени идля изменения количества данных по временному измерению оно должно быть «неограниченным».В противном случае вам просто нужно написать новый файл netCDF, в котором вы измените значение измерения времени на 22.

Я могу предложить только один последний пример, подобный этому, где я сначала создаю случайный набор данных в netCDF и делаю корректировкикак вы хотели:

import numpy as np
from netCDF4 import Dataset,num2date,date2num
# -----------------------------
ndata=21;
dataout=np.random.random((ndata,));
unout='seconds since 2018-01-01 00:00:00'
# ---------------------
# make data:
ncout=Dataset('test.nc','w','NETCDF3_CLASSIC');
ncout.createDimension('time',None);
ncout.createVariable('time','float64',('time'));ncout.variables['time'].setncattr('units',unout);ncout.variables['time'][:]=np.linspace(0,3600*ndata,ndata);
ncout.createVariable('lithk','float32',('time'));ncout.variables['lithk'][:]=dataout;
ncout.close()
# ----------------------
# modify last value:
ncin = Dataset('test.nc', 'a');
datain = ncin.variables['lithk'][:];ntime=np.size(datain);
valout = datain[0] - datain[-1]
ncin.variables['lithk'][ntime:ntime+1] = valout;
ncin.close()
...