我有一系列日期,我想丢弃在特定时间间隔内至少没有另一个日期的任何日期,例如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中删除日期..
答案 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
所以它始终是真的。
将这些组合在一起可以得出两边差异超过五分钟的点(或者一端的差异点)。