[英]Merge two series of time intervals in pandas (intersection)
我有多個時間間隔列表,我需要找到所有這些時間間隔(交叉點)。
例如
a = [['2018-02-03 15:06:30', '2018-02-03 17:06:30'], # each line is read as [start, end]
['2018-02-05 10:30:30', '2018-02-05 10:36:30'],
['2018-02-05 11:30:30', '2018-02-05 11:42:32']]
b = [['2018-02-03 15:16:30', '2018-02-03 18:06:30'],
['2018-02-04 10:30:30', '2018-02-05 10:32:30']]
c = [['2018-02-01 15:00:30', '2018-02-05 18:06:30']]
結果將是
common_intv = [['2018-02-03 15:16:30','2018-02-03 17:06:30'],
['2018-02-05 10:30:30','2018-02-05 10:32:30']]
我發現這個解決方案也應該適用於時間間隔,但我想知道在 pandas 中是否有更有效的方法來做到這一點。
鏈接中建議的解決方案將一次處理兩個列表,即首先找到a
和b
之間的公共間隔,然后將這些公共間隔放入變量common
中,然后找到common
和c
之間的公共間隔等等。 .
當然,全局解決方案(同時考慮所有間隔)會更好!
您可以在兩個方向上使用pandas.merge_asof
來獲得第一個選擇,然后仔細清理結果行。 代碼可以是:
# build the dataframes and ensure Timestamp types
dfa = pd.DataFrame(a, columns=['start', 'end']).astype('datetime64[ns]')
dfb = pd.DataFrame(b, columns=['start', 'end']).astype('datetime64[ns]')
dfc = pd.DataFrame(c, columns=['start', 'end']).astype('datetime64[ns]')
# merge a and b
tmp = pd.concat([pd.merge_asof(dfa, dfb, on='start'),
pd.merge_asof(dfb, dfa, on='start')]
).sort_values('start').dropna()
# keep the minimum end and ensure end <= start
tmp = tmp.assign(end=np.minimum(tmp.end_x, tmp.end_y))[['start', 'end']]
tmp = tmp[tmp['start'] <= tmp['end']]
# merge c
tmp = pd.concat([pd.merge_asof(tmp, dfc, on='start'),
pd.merge_asof(dfc, tmp, on='start')]
).sort_values('start').dropna()
tmp = tmp.assign(end=np.minimum(tmp.end_x, tmp.end_y))[['start', 'end']]
tmp = tmp[tmp['start'] <= tmp['end']]
它按預期給出:
start end
0 2018-02-03 15:16:30 2018-02-03 17:06:30
1 2018-02-05 10:30:30 2018-02-05 10:32:30
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.