Как я могу создать время в правильном формате для экспорта в файл netCDF в MATLAB? - PullRequest
0 голосов
/ 12 февраля 2020

Данные

Я пытаюсь создать измерение времени, используя это:

t1 = datetime(1901,1,1);
t2 = datetime(2016,12,31);
t = t1:t2;

И создать файл netCDF, используя это

nccreate('prec.nc','Prec',...
    'Dimensions',{'time' 42369 'lon' 135 'lat' 129},...
    'Format', 'netcdf4');

Что я пробовал

ncwrite ('pre c .n c', 'time', t);

Сообщение об ошибке

Error using cast
Unsupported data type for conversion: 'datetime'.

Error in internal.matlab.imagesci.nc/write (line 778)
                    scale_factor = cast(1, class(varData));

Error in ncwrite (line 87)
ncObj.write(varName, varData, start, stride);

Вопрос

Как я могу создать ежедневное измерение времени, которое я могу записать в файл netCDF? Каков правильный тип даты для этого преобразования?

1 Ответ

1 голос
/ 12 февраля 2020

NetCDF не определяет единый собственный способ хранения значений даты / времени, но существуют установленные соглашения, , как описано здесь .

Существует две стратегии хранения дата / время в переменную netCDF. Один из них состоит в том, чтобы закодировать его как числовое значение c и единицу, включающую в себя эталонное время, например, «секунды с 2001-1-1 0: 0: 0» или «дни с 2001-1-1 0: 0: 0». " Другой - хранить его как строку, используя стандартную кодировку и календарь. Первый вариант более компактен, если у вас более одной даты, и облегчает вычисление интервалов между двумя датами.

Таким образом, вы можете:

a) Использовать datestr для преобразовать его в строковое значение. Обычный формат строки даты для обмена данными: ISO 8601 , который можно получить в Matlab с помощью datestr(myDateTime, 'yyyy-mm-ddTHH:MM:SS').

b) Преобразовать его в значение цифры c, представляющее секунды или дни. начиная с эталонного "эпохального" времени. Я бы предложил использовать эпоху Unix, поскольку Matlab уже предоставляет для этого удобную функцию преобразования: posixtime(myDateTime). Затем укажите свои единицы измерения для этой переменной в файле NetCDF как 'seconds since 1970-01-01 00:00:00'.

. Вы, вероятно, хотите убедиться, что ваши даты указаны в UT C, прежде чем кодировать их в NetCDF, поэтому вам не нужно беспокоиться о проблемах с часовым поясом.

...