如何以正确的格式创建时间以导出到MATLAB中的netCDF文件?

时间:2020-02-12 06:04:55

标签: matlab netcdf netcdf4

数据

我正在尝试使用以下方法创建时间维度:

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('prec.nc','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 个答案:

答案 0 :(得分:1)

NetCDF并没有定义一种存储日期/时间值的本地方法,但是已经建立了约定as desribed here

有两种将日期/时间存储到netCDF变量中的策略。一种是将其编码为数值和包括参考时间的单位,例如“自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)将其转换为代表自“纪元”时间以来的秒数或天数的数值。我建议使用Unix时代,因为Matlab已经为此提供了一个方便的转换功能:posixtime(myDateTime)。然后在NetCDF文件中将变量的单位指定为'seconds since 1970-01-01 00:00:00'

您可能要在NetCDF中对日期时间进行编码之前先确保日期时间为UTC,所以您不必担心时区问题。

相关问题