罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

介绍新的MATLAB数据类型的日期和时间

今天我想介绍一位客座博主,Andrea Ho,她在MathWorks的MATLAB文档团队工作。今天,Andrea将在R2014b -中讨论在MATLAB中表示日期和时间的三种新数据类型datetime持续时间,calendarDuration

内容

为什么是新的数据类型?

日期和时间通常是数据分析的关键部分。如果它们是你工作的一部分,你可能会遇到以下日期数字、日期向量和日期字符串的一些限制:

  • 序列号对于数值计算很有用,但是它们很难解释或调试。
  • 日期向量和字符串以人类可读的格式清楚地传达日期和时间,但它们对计算和比较没有用处。
  • 日期数字、日期向量和同时表示时间点和时间长度(经过时间)的字符串令人困惑。例如,日期向量[2015 1 1 0 0 0]代表2015年1月1日午夜,还是2015年、1个月和1天的时间?

从R2014b开始,datetime持续时间,calendarDuration是专用于存储日期和时间数据的数据类型,很容易与数值区分开来。这三种类型区分时间点、以固定长度为单位的运行时间(如小时、分钟和秒)和以灵活长度为单位的运行时间(如周和月)。datetime持续时间,calendarDuration以一种易于阅读、适用于计算、具有更高精度(可达纳秒精度)并且内存效率更高的方式表示日期和时间。使用新的数据类型,您不必在相同日期和时间值的不同表示形式之间进行维护或转换。一起工作datetime持续时间,calendarDuration就像你处理数字类型一样,使用标准数组操作。

让我们看看新数据类型的实际应用。

datetime关于时间点

datetime数据类型表示绝对时间点,例如2015年1月1日午夜。的datetime函数可以创建datetime当前日期和时间的变量:

T0 =日期时间(“现在”
t0 = 16-Jan-2015 16:24:30

或者从数字输入:

T0 = datetime(2015,1,1,2,3,4)
t0 = 01-Jan-2015 02:03:04
t0
名称大小字节类属性t0 1x1 121 datetime

如果你只对时间部分感兴趣t0,你可以显示它。

t0。格式=“HH: mm”
T0 = 02:03

更改datetime变量的格式会影响其显示方式,但不会影响其数值。虽然您不能再看到年、月和日的值,但该信息仍然存储在变量中。的日期部分的显示t0回来了。

t0。格式=“dd-MMM-yyyy HH: mm”
t0 = 01-Jan-2015 02:03

通过改变显示格式,可以查看a的值datetime变量高达纳秒精度!

t0。格式=“dd-MMM-yyyy HH: mm: ss。SSSSSSSSS”
t0 = 01-Jan-2015 02:03:04.000000000

如果您经常使用日期字符串格式,那么您会发现一些格式说明符datetime是不同的datestrdatenum,datevec功能. .新的格式语法允许更多的选项,并且现在与Unicode区域数据标记语言(LDML)标准

示例:计算驾驶时间

持续时间数据类型表示两个特定时间点之间的确切差值。假设你开车过夜,2015年1月1日晚上11点离开家,第二天凌晨4:30到达目的地。你在路上花了多少时间?(忽略穿越到另一个时区的可能性;我们会看到datetime控件中管理时区未来的文章.)

T0 = datetime(2015,1,1,23,0,0);T1 = datetime(2015,1,2,4,30,0);Dt = t1-t0
Dt = 05:30:00

dt是一个持续时间变量显示为小时:分钟:秒。就像datetime时,持续时间的行为主要类似于数值,但以一种能够很好地显示时间的格式显示。让我们将格式更改为viewdt以分钟数表示。

dt。格式=“米”
Dt = 330分钟

我们可以对日期和时间变量执行常见的算术运算。尽管dt当前显示为分钟数,我们可以在任何单位中添加或减去持续时间,包括小时和秒。

Dt2 = dt -小时(1)+秒(5)
Dt2 = 270.08分钟

示例:验证付款计划

假设你在2014年1月1日开了一个银行账户。该帐户在每月的最后一天支付利息。让我们找出支付利息的第一天。有没有不依赖于开户日期的解决方案?的dateshift函数用于将日期移动到时间单位的开始或结束。在我们的情况下,我们将把开户日期改到月底。

T0 = datetime(2014,1,1);T1 =移码(t0,“结束”“月”
t1 = 31-Jan-2014

假设我们的记录显示我们在中午收到了利息支付。我们可以把这个信息加到t1通过修改小时财产。

t1。小时= 12;

现在让我们创建一个日期序列来表示接下来的12个付款日期。如果我们增加30天的增量会发生什么t1?

T = t1 + days(0:30:335)'
t = 31- january -2014 12:00:00 02- march -2014 12:00:00 01- april -2014 12:00:00 01-May-2014 12:00:00 31-May-2014 12:00:00 30- june -2014 12:00:00 30- july -2014 12:00:00 29- august -2014 12:00:00 28- september -2014 12:00:00 28-Oct-2014 12:00:00 27- november -2014 12:00:00 27- december -2014 12:00:00

哎呀,大多数约会都不是在一个月的最后一天。一个持续时间30天,每天正好是24小时,这不是正确的步长。正确的步长取决于月份,因为有些月份有30天,而有些月份有31天(也可能是28天或29天)。我们真正想做的是添加一系列日历月t1

T = t1 + calmonths(0:11)'
t = 31- january -2014 28-Feb-2014 31- march -2014 30- april -2014 31-May-2014 30- june -2014 31- july -2014 31- august -2014 30- september -2014 31- october -2014 30- november -2014 31- december -2014

calmonths函数创建calendarDuration包含日历月份的数组。一个calendarDuration值表示一个灵活的或非恒定的时间量,例如1个月。如果不知道我指的是一年中的哪个月,就无法确切地知道一个月里有多少天、小时、分钟或秒。一个日历月的长度是未知的,直到你把它与一个特定的时间点联系起来。

每个付款日期之间有多少天?

Dt = caldiff(t,“天”
Dt = 28d 31d 30d 31d 30d 30d 31d 31d 30d 31d 30d 30d 31d

每个增量日历月表示不同的天数。

我们的银行给了我们一个名为interest.txt这包含了一年中每个月的利息金额。方法可以交互地导入此数据导入工具

或者,我们可以使用readtable而且textscan函数以编程方式读取文件。使用% D说明符读取日期或时间字符串,并在花括号内指定字符串格式。

T =可读的(“interest.txt”“格式”'%{dd MMMM yyyy HH:mm}D %f'
T =日期利息_______________________ ________ 2014年1月31日12:00 1.93 2014年2月28日12:00 4.28 2014年3月31日12:00 4.82 2014年4月30日12:00 1.23 2014年5月31日12:00 5.89 2014年6月30日12:00 2.26 2014年7月31日12:00 3.84 2014年8月31日12:00 5.82 2014年9月30日12:00 2.51 2014年10月31日12:00 2.99 2014年11月30日12:00 6.17 2014年12月31日12:00 2.65

的值,即使文本文件包含字符串日期表中的列不是字符串。他们是datetime值。

如果我们将我们的支付时间与银行的数据进行比较,我们会发现它们是相同的。

T.Date isequal (t)
Ans = 1

现在让我们计算每个月底的累计利息,并绘制数据。当使用情节,与datetime比使用序列号简单多了。

c_payments = cumsum(t .利息);图表(T.Date,c_payments) xlabel(“日期”) ylabel (“累计利息支付”

日期轴被自动标记为易于理解的日期字符串。你再也不用打电话了datetick这样做!如果要更改日期的格式,可以在调用中指定所需的轴刻度格式情节

图绘制(T。日期,c_payments,“DatetimeTickFormat”“嗯”)包含(“日期”) ylabel (“累计利息支付”) ax = gca;斧子。XTickLabelRotation = -15;

要使用其他绘图函数创建包含日期和时间值的图表,目前仍需要使用序列号。我们认识到这是不方便的,我们正在计划改进。你可以了解更多在这里关于如何绘图datetime而且持续时间值。

还有什么?

请注意,在我们对旅行时间和利息支付的分析中,根本不需要使用连续日期数字、日期向量或字符串。datetime持续时间,calendarDuration允许您快速和更直观地操作日期和时间。新的数据类型将用于替换datenumdatevec,datestr.然而,在可预见的未来,这些旧函数将继续存在于MATLAB中,因为我们知道许多人在现有代码中依赖它们。

在以后的文章中,我将展示如何做datetime持续时间,calendarDuration允许您使用除英语以外的其他语言的时区、夏令时和日期。

你的想法呢?

您认为自己会对数据使用新的日期和时间数据类型吗?请留下评论告诉我们在这里




发布与MATLAB®R2014b


  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。