我有日期的阵列,并且我想丢弃不具有至少一个在一个特定的时间间隔另一个日期的任何日期,例如5分钟。 我需要找到一个聪明的办法做到这一点,如循环具有更大的数据集需要永远。
输入数据:
2009年07 07 16点01分30秒
2009年07 07 16点04分06秒
2009年07 07 16:05:00
2009年07 07 16时十二分00秒
2009年07 07 16时十九分43秒
2009年07 07十六点24分00秒
结果:
2009年07 07 16点01分30秒
2009年07 07 16点04分06秒
2009年07 07 16:05:00
2009年07 07 16时十九分43秒
2009年07 07十六点24分00秒
2009年07 07 16时十二分00秒的值被丢弃,因为它是从任何其他时间戳超过5分钟的路程。
谢谢,克里斯提
次要问题:
无论Dan和nkjt建议工作的实现,谢谢! 如果日期是2个基团的一部分:A或B和我想找到如果存在来自具有B组对应的日期是一个秒间隔数/分钟内A组的日期? 如果不只是删除从A组的日期..
您可以使用diff
。 你需要使用datenum
将数据转换成价值的载体。 在MATLAB datenums,“1”是一个单一的一天,所以可以定义一个时间单元,通过那些在一天的数量除以方面具有datenum步骤:
s = num_mins/(24*60);
下面是与差异的伎俩:
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
所以它总是如此。
结合这些给了我们该差超过五分钟两侧(或为终点,在一侧)的点。