Есть ли простой способ чтения целочисленных данных времени из файла netcdf с использованием атрибута времени?

Я пытаюсь прочитать данные о временных координатах из файла netCDF, используя Matlab. У меня есть файл netCDF (который я создал), в котором есть переменная времени в формате двойника, соответствующая количеству часов от определенного времени (см. ниже).

Атрибуты переменных:

    double time(Time) ;
            time:standard_name = "Time" ;
            time:units = "hours since 2002-01-01 0:0:0" ;
            time:calendar = "proleptic_gregorian" ;

Когда я читаю переменную времени с помощью ncread) в Matlab, она просто выводит целое число, например, 1. Однако, если я использую «ncdump» для изучения файла, я вижу переменную времени в его координатах, например, 2002-01-01 01.

В частности: "ncdump -t -v время ncfile.nc"

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

В качестве альтернативы, должен ли я просто создать новую переменную времени в этих файлах, которая представляет собой просто массив дат в виде строк?

Любая информация очень ценится! Спасибо!


person user3315987    schedule 09.07.2014    source источник


Ответы (1)


NetCDF хранит время как смещение от эпоха. Из вашего атрибута переменной ваша эпоха — 01.01.2002 0:0:0, а с тех пор прошло несколько часов. У Matlab есть аналогичная методология, называемая числами дат, хотя она основана на количестве дней, прошедших с эпохи (которые они называют опорными годами). Вам следует изучить две функции: datenum и datestr. Первый преобразует строку в число даты, а другой преобразует число даты в строку даты.

Вы можете преобразовать переменную времени в совместимый номер даты Matlab, разделив ее на 24, а затем использовать функцию datestr для ее форматирования по своему усмотрению. Вот простой пример:

>> time = [1;2;3;4];
>> datestr(time./24+datenum('2002-01-01 0:0:0'))
ans =
01-Jan-2002 01:00:00
01-Jan-2002 02:00:00
01-Jan-2002 03:00:00
01-Jan-2002 04:00:00

Посмотрите файлы справки Matlab, связанные с двумя функциями, и вы можете отформатировать вывод даты по своему усмотрению.

person Cory N.    schedule 10.07.2014