罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

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

为日期/时间数据设置新的时间基础

我最近和一个人一起工作,他有一些不同格式的时间数据,并试图以一种有意义的方式合并它们。

内容

问题的设置

我做了一个数据的小子集并加载进去。

负载setTimeBasis
名称大小字节类属性mydatestr 1x6 12 char t 5x1 161 datetime

首先我看了这两个变量。

mydatestr
Mydatestr = 090506
t
T = 12:32:28 12:59:50 12:59:51 12:59:52 12:59:53

您可以看到我有一个表示日期(May 6, 2009)的字符串,然后是一个datetime数组中t.虽然我看到了t是一个datetime,我一直认为它是一个持续时间,因为我没有看到一个月,一年,等等。我必须承认,虽然我通常会检查文件,但我昨天真的很抗拒——不知道为什么——也许我比平时更固执了:-)!

什么不起作用

接下来,我将基准日期转换为datetime,并尝试将其添加到t

D =日期时间(“090506”“InputFormat”“MMddyy”试一试D + tE disp (E.message)结束
d = 05-Sep-2006 datetime数组之间没有定义加法。

第一个工作镜头

好吧,这是行不通的。我终于意识到,即使t只显示小时,分钟和秒,因为它是datetime数组,而不是持续时间我必须要处理这个问题!我还意识到我在转换原始日期时使用了错误的格式mydatestr到一个datetime!我在想什么!

Newdate =日期时间(mydatestr,“InputFormat”“yyMMdd”
newdate = 06-05-2009

现在让我们检查第一个时间点。

T1 = t(1);[年(t1)月(t1)日(t1)]
Ans = 2016 6 7

啊哈!现在我需要转换日期(不是时间)值tolddate!我可以通过计算日期的差异来做到这一点,得到a持续时间数组可以添加到基准日期。

Olddate = datetime(年(t1),月(t1),日(t1));Datediff = newdate - olddate newt = t + Datediff
Datediff = -62136:00:00 newt = 12:32:28 12:59:50 12:59:51 12:59:52 12:59:53

让我们看看现在有什么纽特现在(我知道,眼睛(纽特)!)

Newt1 = newt(1);newt1。格式=“yy-MM-dd hh: mm: ss”
Newt1 = 09-05-06 12:32:28

更好的答案

坦率地说,我把它工作,但它真的很丑,有点扭曲。如果我以前负责任地阅读文档,我可能会找到更好的方法。现在我不给你看医生,我将向你展示另一种获取更多信息的方法。我们来看看用a能做什么datetime数组中。

方法(t)
类datetime的方法:Between hour le caldiff interp1 length second cat intersect linspace setdiff cellstr isbetween lt setxor char iscolumn最大大小:isdst mean sort ctranspose isempty median sortrows datenum isequal min STD dateshift isequal - timeofday datestr isfinite minute transpose datetime isinf mode tzoffset datevec ismatrix month union day ismember ndims唯一的diff isnat ne vertcat eq isrow number week exceltime isscalar permute year ge issorted plot ymd gt isvector + yyyymmdd HMSisweekend posixtime horzcat juliandate quarter静态方法:setDefaultFormats

嗯!timeofday听起来很有趣,不是吗?让我们再试一次。

Newdate =日期时间(mydatestr,“InputFormat”“yyMMdd”) Tod = timeofday(t) newt2 = newdate + Tod whoos
名称大小字节类属性E 1x1 3106 MException ans 1x3 24 double d 1x1 121 datetime datediff 1x1 128 duration mydatestr 1x6 12 char newdate 1x1 121 datetime newt 5x1 201 datetime newt1 1x1 147 datetime newt2 5x1 185 datetime olddate 1x1 121 datetime t 5x1 161 datetime t1 1x1 129 datetime tod 5x1 160持续时间

所以现在我们有了像样的工作代码,比第一次成功的尝试要好得多!

注:

这也可以用for循环来完成,而不是将数组作为数组处理。对于较大的数据集,我的同事发现For循环解决方案(包括使用老式的datestr等工具)耗时29.0秒,第一个矢量化版本耗时2.3秒。我猜第二次尝试的速度更快,但没有计时。

你呢?

从R2014b版本开始,您一直在使用新的日期和时间特性吗?你在哪些方面取得过成功或遇到过困难?让我们知道在这里

也许能帮到你,我们还有简短的视频关于datetime你可能会感兴趣。计算快乐!




发布与MATLAB®R2016a


评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。