在python的时间列中找到共享时间(重叠)

时间:2018-12-30 10:35:14

标签: python pandas datetime dataframe

我试图找到一个共享时间,其中代表开始时间和结束时间的两个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

有没有一种有效的方法来实现它?

1 个答案:

答案 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