首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并pandas中的两个时间间隔序列(交集)

合并pandas中的两个时间间隔序列(交集)
EN

Stack Overflow用户
提问于 2020-04-09 15:41:05
回答 1查看 131关注 0票数 1

我有多个时间间隔列表,我需要找到所有时间间隔(交集)的公共时间间隔。

例如。

代码语言:javascript
复制
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']]

其结果将是

代码语言:javascript
复制
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']]

我已经找到了this解决方案,应该也适用于时间间隔,但我想知道是否有更有效的方法来做熊猫。

链接中提出的解决方案将一次处理两个列表,即首先查找ab之间的公共间隔,然后将这些公共间隔放入变量common中,然后查找commonc之间的公共间隔,依此类推……

当然,全局解决方案(同时考虑所有间隔)会更好!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 17:19:22

您可以在两个方向上使用pandas.merge_asof来获得第一个选择,然后仔细清理结果行。代码可以是:

代码语言:javascript
复制
# 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']]

不出所料,它提供了:

代码语言:javascript
复制
                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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61116188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档