7 日期和时间
MATLAB在2014b版本中将日期和时间独立成了一个数据类型,新的版本中对于时间数据的处理功能更为强大。比如datetime和duration等函数,可以支持对时间的高效计算、对比、格式化显示。对这类数组的操作方法和对普通数组的操作是基本一致的。下面我们就对主要的功能进行介绍。
7.1 创建日期和时间数组
存储日期和时间信息的最主要形式就是datatime数组,它支持代数运算、排序、比较、绘图和格式化显示。代数运算的结果通过duration数组返回,如果采用基于日历的函数进行的计算,那么返回的结果将是calendarDuration数组。Matlab提供了以下函数来进行日期及时间类型的计算,请见表3-11 。
表3-11 日期和时间函数
函 数 | 说 明 | 函 数 | 说 明 |
datetime | 基于当前日期创建时间数组,或者将日期字符串或数据转换为时间数组 | yyyymmdd | 将MATLAB datetime数据类型转化为YYYYMMDD数值格式 |
years | 年数长度 | minutes | 分钟数长度 |
days | 天数长度 | seconds | 秒数长度 |
hours | 小时数长度 | duration | 由数值创建duration数组 |
calyears | 日历年数长度 | calweeks | 日历星期数长度 |
calquarters | 日历季度数长度 | caldays | 日历天数长度 |
calmonths | 日历月数长度 | calendarDuration | 由数值创建日历时间长度数组 |
下面我们举例来说明如何创建日期和时间数组。
【例3-41】 日期时间数组创建。
例如,如果我们想要来表示这样两个日期:June 28, 2014 at 6 a.m和June 28, 2014 at 7 a.m,那么我们可以将这些数值相应的赋值给datetime函数各元素即可:
>> t = datetime(2014,6,28,6:7,0,0)
t =
28-Jun-2014 06:00:00 28-Jun-2014 07:00:00
如果想要对数组中的某一元素进行修改,那么只需要将新的数值赋值给相应的元素即可:
>> t.Day = 27:28
t =
27-Jun-2014 06:00:00 28-Jun-2014 07:00:00
如果想要更改数组的显示格式,只需要改变Format属性即可。这一过程中改变的只是数据显示格式,数据本身没有任何改动。
>> t.Format = 'MMM dd, yyyy'
t =
Jun 27, 2014 Jun 28, 2014
如果你要将一个datetime数组减去另一个datetime数组,那么结果就是duration数组:
>> t2 = datetime(2014,6,29,6,30,45)
t2 =
29-Jun-2014 06:30:45
>> d = t2 - t
d =
48:30:45 23:30:45
在默认情况下,duration数组显示格式是“hours:minutes:seconds”。通过设置Format属性,用户可以改变显示格式。例如可以改变为单一单位“小时”,具体操作如下:
>> d.Format = 'h'
d =
48.512 hrs 23.512 hrs
用户通过使用seconds、minutes、hours、days或 years函数,也可以直接创建一个新的单一单位的duration数值。例如,创建一个2天的天数长度,也就是正好等于24小时×2:
>> d = days(2)
d =
2 days
用户通过使用caldays、calweeks、calquarters和calyears函数,也可以直接创建一个新的单一单位的calendar duration数值。例如,创建一个2个月的日历天数长度:
>> L = calmonths(2)
L =
2mo
如果将一个calendar months 和一个calendar days数值相加,那么天数数值还将会分开显示,因为每个月的天数并不一致。除非是将其和一个具体的日期时间相加。
>> L = calmonths(2) + caldays(35)
L =
2mo 35d
将一个calendar durations和一个datetime数组相加:
>> t2 = t + calmonths(2) + caldays(35)
t2 =
Oct 01, 2014 Oct 02, 2014
此时得到的t2依然是一个datetime数组。
>> whos t2
Name Size Bytes Class Attributes
t2 1x2 161 datetime
总的来说,有多种方式来表达日期和时间,MATLAB对于每一种都提供了方法(如图3-7所示):
(1)表达时间点,使用datetime数据格式。例如Wednesday, June 18, 2014 10:00:00。
(2)表达一段时间的长度,采用固定时间长度单位,使用duration数据类型。在使用此种类型的时候,1天总是等于24小时的,一年总是等于365.2425天的。例如:72 小时10分钟。
(3)表达一段时间的长度,采用可变时间长度单位,使用calendarDuration数据类型。例如1个月可以是28、29、30或者31天。另外calendarDuration还考虑了夏令时和闰年,所以1天时间可以大于或者小于24小时,1年可以是365天或者366天。
图3-7 选择需要导入的图像文件
【例3-42】 指定时区与相关计算。
在对日期和时间的计算中,MATLAB还提供了时区设置选项。这样我们只需在创建日期时间数组的时候指定好了时区,那么就可以在不同时区之间进行相关计算了,而不必人工换算中间有多少时差。下面我们就举例来说明如何来使用。
首先创建指定了时区的datetime数组:
>> t = datetime(2014,3,8:9,6,0,0,'TimeZone','local',...
'Format','d-MMM-y HH:mm:ss Z')
t =
8-Mar-2014 06:00:00 +0800 9-Mar-2014 06:00:00 +0800
在这里我们指定的是系统内部的时区设置'local',返回的结果中“+0800”一项就是我们所处的时区和Coordinated Universal Time之间的时差。
用户也可以指定时区:
>> t.TimeZone = 'Asia/Tokyo'
t =
8-Mar-2014 07:00:00 +0900 9-Mar-2014 07:00:00 +0900
同样的方式我们可以定义另一个伦敦时间:
>> u = datetime(2014,3,9,6,0,0,'TimeZone','Europe/London',...
'Format','d-MMM-y HH:mm:ss Z')
u =
9-Mar-2014 06:00:00 +0000
两个时间相减,就可以得到两个时间点相差的实际时间:
>> dt = t - u
dt =
-32:00:00 -8:00:00
【例3-43】 日期和时间序列的产生。
本例将来为读者演示如何通过使用冒号(:)来产生日期和时间序列。
采用默认步长来产生序列,默认步长为1个日历天。
>> t1 = datetime('01-Nov-2013 08:00:00');
t2 = datetime('05-Nov-2013 08:00:00');
t = t1:t2
t =
Columns 1 through 3
01-Nov-2013 08:00:00 02-Nov-2013 08:00:00 03-Nov-2013 08:00:00
Columns 4 through 5
04-Nov-2013 08:00:00 05-Nov-2013 08:00:00
用户还可以指定步长:
>> t = t1:caldays(2):t2 % 使用caldays函数来指定2个日历天为步长
t =
01-Nov-2013 08:00:00 03-Nov-2013 08:00:00 05-Nov-2013 08:00:00
>>t = t1:hours(18):t2 % 使用18个小时作为步长
t =
Columns 1 through 3
01-Nov-2013 08:00:00 02-Nov-2013 02:00:00 02-Nov-2013 20:00:00
Columns 4 through 6
03-Nov-2013 14:00:00 04-Nov-2013 08:00:00 05-Nov-2013 02:00:00
通过指定时区为纽约时间,t1所对应时间正好在夏令时之前。
>> t1.TimeZone = 'America/New_York';
>> t2.TimeZone = 'America/New_York';
如果用户这时使用1个日历天为步长,那么这两个时间点之间每天的时间长度并不都是24小时:
>> t = t1:t2;
>> dt = diff(t)
dt =
24:00:00 25:00:00 24:00:00 24:00:00
如果将步长设置为固定长度的1天:
>> t = t1:days(1):t2
t =
Columns 1 through 3
01-Nov-2013 08:00:00 02-Nov-2013 08:00:00 03-Nov-2013 07:00:00
Columns 4 through 5
04-Nov-2013 07:00:00 05-Nov-2013 07:00:00
这时我们可以验证各时间点之间的长度是否都等于24小时:
>> dt = diff(t)
dt =
24:00:00 24:00:00 24:00:00 24:00:00
【例3-44】 日期和时间序列的计算。
日期和时间序列可以像数组那样进行加减。
首先我们创建一个日期时间点:
>> t1 = datetime('01-Nov-2013 08:00:00');
然后讲一个固定长度小时数组加到这一个时间点上:
>> t = t1 + hours(0:2)
t =
01-Nov-2013 08:00:00 01-Nov-2013 09:00:00 01-Nov-2013 10:00:00
我们还可以加上一个日历月份时间长度:
>> t = t1 + calmonths(1:5)
t =
Columns 1 through 3
01-Dec-2013 08:00:00 01-Jan-2014 08:00:00 01-Feb-2014 08:00:00
Columns 4 through 5
01-Mar-2014 08:00:00 01-Apr-2014 08:00:00
上面结果中的每一个时间点都是当月的第一天。如果我们要计算数组时间点之间的相隔天数,我们可以使用以下命令:
>> dt = caldiff(t,'days')
dt =
31d 31d 28d 31d
如果要产生一个每月最后一天的日期序列,可以通过如下方法:
>> t = datetime('31-Jan-2014') + calmonths(0:11)
t =
Columns 1 through 5
31-Jan-2014 28-Feb-2014 31-Mar-2014 30-Apr-2014 31-May-2014
Columns 6 through 10
30-Jun-2014 31-Jul-2014 31-Aug-2014 30-Sep-2014 31-Oct-2014
Columns 11 through 12
30-Nov-2014 31-Dec-2014