如何在特定时间间隔内对日期进行分组

时间:2014-09-17 10:36:54

标签: matlab date optimization intervals

我有一系列日期,我想丢弃在特定时间间隔内至少没有另一个日期的任何日期,例如5分钟。我需要找到一种聪明的方法,因为循环需要一个更大的数据集。

输入数据:

2009 07 07 16:01:30

2009 07 07 16:04:06

2009 07 07 16:05:00

2009 07 07 16:12:00

2009 07 07 16:19:43

2009 07 07 16:24:00

结果:

2009 07 07 16:01:30

2009 07 07 16:04:06

2009 07 07 16:05:00

2009 07 07 16:19:43

2009 07 07 16:24:00

2009 07 07 16:12:00的价值被放弃了,因为距离任何其他时间戳超过5分钟。

谢谢, 克里斯提


次要问题:

Dan和nkjt都提出了一个有效的实现,谢谢!如果日期是2组的一部分怎么办:A或B我想知道是否存在来自A组的日期,其中B组中的相应日期相隔几秒/分钟?如果不是只从组A中删除日期..

1 个答案:

答案 0 :(得分:1)

您可以使用diff。您需要使用datenum将数据转换为值向量。在MATLAB datenums中,“1”是一天,因此您可以根据时间单位除以一天中的数量来定义日期步骤:

s = num_mins/(24*60);

以下是diff的技巧:

x = datenum(mydata);
s = num_mins/(24*60);
% for increasing times we shouldn't need the `abs` but to be safe
d = abs(diff(x));
q = [d (s+1)]>s&[(s+1) d]>s;

(您可以使用datestr转换回来,或将q应用于原始数据)

工作原理:

diff的输出比原始输出短一些 - 它只是相邻值之间的差异。我们需要它是方向性的 - 检查每个值与之前和之后的值。

[d (s+1)]>s使矢量与原始矢量长度相同,并检查差值是否大于s。因为我们将最后一个值设置为s + 1,所以最终值将始终返回true。这是检查一个值与其后面的值之间是否存在差距(因此对于最终值,这始终为真)。

[(s+1) d]>s做同样的事,但在另一边。同样,我们设置一个值,这次是第一个,大于s所以它始终是真的。

将这些组合在一起可以得出两边差异超过五分钟的点(或者一端的差异点)。