2015-10-07 56 views
4

我有与开始和结束时间戳记录列表,像这样:寻找时间序列数据的总时间不重叠

[{u'end_time': 1444197616.0, u'start_time': u'2015-10-07T05:59:58Z'}, ...] 

这些时间段可以重叠,我无法弄清楚如何找到总的持续时间没有重叠。例如:

BEGIN END 
03:00 03:03 
03:02 03:05 
03:04 03:05 
03:01 03:06 
03:08 03:10 

0 - 3 
    2 - 5 
     4 - 5 
1 -  6 
       8 - 10 

总计= 8分钟。

我想我可以通过找出差距来做到这一点,但是怎么做?

+0

你的'end_time'全部在'2015-10-07T05:59:58Z''格式中,都是时间戳和'start_time'吗? –

回答

0

我会得到解决的范围在常规花车,它应该扩展到很容易DATETIME ...

让我们假设数据是[start, end]名单序列。如果不是这种格式,您可以轻松将其转换为此格式。

首先,我会按开始时间对数据进行排序。由于您现在知道指数i + 1上的范围只能扩大指数i的范围,因此您可以更轻松地进行操作,因为指数范围为i,或者开始时为下一个折叠范围的开始。

接下来,我会看当前索引和下一个索引处的范围的开始和结束。如果下一个索引的开始位于当前范围内,则可以将其合并为一个。继续这样做直到下一个索引的开始不在当前范围内,然后产生当前范围。我认为应该是这个样子:

def get_collapsed_ranges(ranges): 
    ranges = iter(sorted(ranges)) 
    current_range = next(ranges) 
    for start, end in ranges: 
     if start > current_range[1]: 
      yield current_range 
      current_range = [start, end] 
     elif end > current_range[1]: 
      current_range[1] = end 
    yield current_range 

我没有测试过这种广泛的,但它至少适用于您的测试数据:

>>> list(get_collapsed_ranges([[0,3], [2,5], [4,5], [1,6], [8,10]])) 
[[0, 6], [8, 10]] 

当然,从这里开始,得到总持续时间,你可以将折叠范围内的差异和Bob的叔叔进行总结。