Pandas:按以下方式计算一组上的时间间隔交叉点

joh*_*hun 5 python pandas pandas-groupby

我有以下形式的数据框

import pandas as pd

Out[1]:
df = pd.DataFrame({'id':[1,2,3,4,5],
          'group':['A','A','A','B','B'],
          'start':['2012-08-19','2012-08-22','2013-08-19','2012-08-19','2013-08-19'],
          'end':['2012-08-28','2013-09-13','2013-08-19','2012-12-19','2014-08-19']})

     id group       start         end
0   1     A  2012-08-19  2012-08-28
1   2     A  2012-08-22  2013-09-13
2   3     A  2013-08-19  2013-08-21
3   4     B  2012-08-19  2012-12-19
4   5     B  2013-08-19  2014-08-19
Run Code Online (Sandbox Code Playgroud)

对于数据框中的给定行,我想计算同一组中具有重叠时间间隔的项目数。

例如,在 A 组中,id 2 的范围为 2012 年 8 月 22 日至 2013 年 9 月 13 日,因此 id 1(2012 年 8 月 19 日至 2012 年 8 月 28 日)和 id 3(2013 年 8 月 19 日至 2013 年 8 月 21 日)之间的重叠计数为 2 .

相反,B组中的项目之间没有重叠

所以对于我上面的示例数据框,我想产生类似的东西

Out[2]:
   id group       start         end  count
0   1     A  2012-08-19  2012-08-28      1
1   2     A  2012-08-22  2013-09-13      2
2   3     A  2013-08-19  2013-08-21      1
3   4     B  2012-08-19  2012-12-19      0
4   5     B  2013-08-19  2014-08-19      0
Run Code Online (Sandbox Code Playgroud)

我可以“蛮力”这样做,但我想知道是否有更有效的 Pandas 方法来完成这项工作。

在此先感谢您的帮助

小智 2

“蛮力”但完成了工作:

首先将日期字符串转换为日期,然后使用 apply 将每一行与 df 进行比较。

df.start = pd.to_datetime(df.start)
df.end = pd.to_datetime(df.end)

df['count'] = df.apply(lambda row: len(df[ ( ( (row.start <= df.start) & (df.start <= row.end) ) \
                                            | ( (df.start <= row.start) & (row.start <= df.end) ) )
                           & (row.id != df.id) & (row.group == df.group) ]),axis=1)
Run Code Online (Sandbox Code Playgroud)