我试图找到一个共享时间,其中代表开始时间和结束时间的两个datetime列与其他记录重叠。
例如,如果我们有这两列:
Start End
2016-08-22 20:20:00 2016-08-22 20:30:00
2016-08-22 20:55:00 2016-08-22 21:53:00
2016-08-22 21:38:00 2016-08-22 21:58:00
我想检查它们之间的重叠,输出将是:
Start End Overlap
2016-08-22 20:20:00 2016-08-22 20:30:00 NaN
2016-08-22 20:55:00 2016-08-22 21:53:00 2016-08-22 21:38:00
2016-08-22 21:38:00 2016-08-22 21:58:00 2016-08-22 21:38:00
有没有一种有效的方法来实现它?
答案 0 :(得分:0)
这是一种可能的方法。您可以定义以下功能:
def common_row(x):
rows = df.loc[df.index != x.name,:]
s = [min(x.End -y.Start, y.End - x.Start).total_seconds() > 0 for
y in rows.itertuples()]
shared = rows.index[s].values
if shared.size > 0:
return df.loc[shared[0], 'Start']
它的作用是寻找其他具有时间重叠的行,并从重叠的行中分配时间Start
(如示例输出所示,该行将不是当前行)。
如果您将其应用于axis 1
,则会得到:
df['Overlap'] = df.apply(lambda x: common_row(x), axis=1)
Start End Overlap
0 2016-08-22 20:20:00 2016-08-22 20:30:00 NaT
1 2016-08-22 20:55:00 2016-08-22 21:53:00 2016-08-22 21:38:00
2 2016-08-22 21:38:00 2016-08-22 21:58:00 2016-08-22 20:55:00
如果要使行的索引与时间重叠,则可以改用:
def common_row(x):
rows = df.loc[df.index != x.name,:]
s = [min(x.End -y.Start, y.End - x.Start).total_seconds() > 0 for
y in rows.itertuples()]
shared = rows.index[s].values
if shared.size > 0:
return int(shared[0])
在这种情况下,谁会给出:
df['Overlap'] = df.apply(lambda x: common_row(x), axis=1)
Start End Overlap
0 2016-08-22 20:20:00 2016-08-22 20:30:00 NaN
1 2016-08-22 20:55:00 2016-08-22 21:53:00 2.0
2 2016-08-22 21:38:00 2016-08-22 21:58:00 1.0