2015-10-07 59 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的叔叔進行總結。