日期和时间
在Matlab中有几种不同的方法来处理日期和时间。本教程回顾了不同的日期格式,并在地球科学数据的背景下讨论了与它们相关的相对优缺点。
内容
介绍和概述
作为一个例子,我们将考虑打包时间的方式NetCDF格式。当然,从NetCDF文件加载时间的最简单方法是使用CDT函数ncdateread,但本教程关注的是幕后发生的事情ncdateread,所以我们将从原始时间格式开始,因为它被打包在示例.nc文件中。
首先阅读时间数组:
t = ncread (“ERA_Interim_2017.nc”,“时间”)
T = 12×1 int32列向量1025628 1026372 1027044 1027788 1028508 1029252 1029972 1030716 1031460 1032180 1032924 1033644
在这一点上,您可能会感到有些困惑。这些数字是什么?使用ncdisp为了获得一些见解:
ncdisp (“ERA_Interim_2017.nc”,“时间”)
来源:/home/chad/Documents/MATLAB/github/cdt/cdt_data/ERA_Interim_2017。nc格式:64bit Dimensions: time = 12 (UNLIMITED) Variables: time Size: 12x1 Dimensions: time Datatype: int32 Attributes: units = 'hours since 1900-01-01 00:00:00.0' long_name = 'time' calendar = 'gregorian'
它告诉我们的单位时间是
单位= '时间自1900-01-01 00:00:00.0'
有时候单位可能是1971年以来的几天,或者是宇宙大爆炸后的几年,或者是我出生后的秒,所以一定要检查单位。
1900年以来以小时为单位的时间不是很容易理解,所以我建议养成使用这两种方式的习惯datenum或datetime格式保持一致。Matlab使两者之间的切换变得非常容易datenum和datetime格式,但它们各有优缺点。这里有一个故障:
- datenum:单位是自公元0年1月1日以来的天数,这是Matlab几十年来的标准日期格式。如果你输入现在在你的命令窗口,它会说类似这样的话ans = 7.3740 e + 5因为距离耶稣诞生已经超过737000天了。使用datestr,datevec,或datetime转换datenum日历日期。
- datetime:该格式在Matlab 2014b中引入。因为datetime是一个对象,它能够在许多方面是“智能的”,因为Matlab总是知道它代表时间(相对于datenum这对Matlab来说只是一个数字)。但是因为datetime“智能”有时会有意想不到的行为或不兼容,在什么情况下datenum也许是个更好的选择。
对于示例文件,请记住这一点t代表自1900年元旦午夜罢工以来的小时数。所有这些数字都在这里t是这样的。
datenum
把这些时间转换成datenum格式,用1900,1,1作为日期和编号t在小时的地方。
此外,时间NetCDF文件中的变量为int32格式datenum不接受。所以转换t调用时加倍datenum:
t = datenum(1900年,1,1,双(t), 0, 0)
T = 736696.50 736727.50 736755.50 736786.50 736816.50 736847.50 736877.50 736908.50 736939.50 736969.50 737000.50 737030.50
datestr
这些是日期数字,对我们人类来说没有多大意义。但是我们已经看到了一些有趣的东西:datenums不是整数——它们都以.5,意思是每天的时间对应中午。要理解这些数据表的意思,只需将它们放入datestr功能:
datestr (t)
ans = 12×20 char array '01- 1- 2017 12:00:00' '01- 2 -2017 12:00:00' '01- 3 -2017 12:00:00' '01- 4 -2017 12:00:00' '01- 5 -2017 12:00:00' '01- 6 -2017 12:00:00' '01- 7 -2017 12:00:00' '01- 8 -2017 12:00:00' '01- 10 -2017 12:00:00' '01- 11 -2017 12:00:00' '01- 12 -2017 12:00:00'
这正好告诉我们我们的预期:这个月度数据对应于2017年每个月的第一天中午。
datevec
另一种有用的格式叫做datevec.日期向量非常有用,特别是当您只想分析与9月份相关的数据时。日期向量给出了与任何给定时间相关联的年、月、日(以及小时、分钟和秒,如果您愿意的话)t.下面是如何从datnum数组中获取日期向量:
[年,月,日]= datevec(t);
这样,我们就知道了每一次的年、月和日t.以下是全部展示:
(年月日)
Ans = 2017.00 1.00 2017.00 2.00 1.00 2017.00 3.00 1.00 2017.00 4.00 1.00 2017.00 5.00 1.00 2017.00 6.00 1.00 2017.00 7.00 7.00 1.00 2017.00 8.00 1.00 2017.00 9.00 1.00 2017.00 10.00 1.00 2017.00 11.00 1.00 2017.00 12.00 1.00
这个有用的原因是,现在很容易得到对应于给定月份的所有日期的索引。例如,以下是所有与9月份数据相对应的指数:
印第安纳州= = = 9月
Ind = 12×1 logical array 0 0 0 0 0 0 1 0 0 0
datetime
如果您想将datenum转换为datetime格式,只需输入t到datetime函数,并告诉它你想从日期枚举转换:
t = datetime (t)“ConvertFrom”,“datenum”)
t = 12×1 datetime array 01-Jan-2017 12:00:00 01-Feb-2017 12:00:00 01-Mar-2017 12:00:00 01- april -2017 12:00:00 01-May-2017 12:00:00 01- june -2017 12:00:00 01- july -2017 12:00:00 01-Aug-2017 12:00:00 01-Sep-2017 12:00:00 01-Oct-2017 12:00:00 01- 11 -2017 12:00:00 01-Dec-2017 12:00:00
转换回日期enum很简单:
t = datenum (t)
T = 736696.50 736727.50 736755.50 736786.50 736816.50 736847.50 736877.50 736908.50 736939.50 736969.50 737000.50 737030.50
作者信息
本教程由Chad A. Greene于2019年2月为Matlab气候数据工具箱编写。