Вот возможный подход.Вы можете определить следующую функцию:
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