日期和时间

返回气候数据工具目录

在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年以来以小时为单位的时间不是很容易理解,所以我建议养成使用这两种方式的习惯datenumdatetime格式保持一致。Matlab使两者之间的切换变得非常容易datenumdatetime格式,但它们各有优缺点。这里有一个故障:

对于示例文件,请记住这一点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格式,只需输入tdatetime函数,并告诉它你想从日期枚举转换:

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气候数据工具箱编写。