【问题标题】:Find a shared time (overlap) in time columns in python在python的时间列中查找共享时间(重叠)
【发布时间】:2018-12-30 10:35:13
【问题描述】:

我试图找到一个共享时间,其中表示开始时间和结束时间的两个日期时间列与其他记录重叠。

例如,如果我们有这两列:

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

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

【问题讨论】:

  • 能否请您解释一下为什么2016-08-22 21:38:00 在这两种情况下?
  • @yatu 因为这是两列共享的日期。
  • 据我了解,第 1 行和第 2 行共享时间从 2016-08-22 21:38:00 2016-08-22 21:53:00
  • @yatu 是第 2 行和第 3m 行,因为它在上一条记录的范围内。

标签: python pandas datetime dataframe


【解决方案1】:

这是一种可能的方法。您可以定义以下函数:

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

【讨论】:

  • 这对@shahad 没有帮助吗?
猜你喜欢
  • 2020-02-28
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2023-01-12
  • 1970-01-01
  • 2016-04-29
相关资源
最近更新 更多