Найти общее время (перекрытие) в столбцах времени в Python - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь найти общее время, когда два столбца даты и времени, представляющих время начала и окончания, перекрываются с другими записями.

например, если у нас есть эти два столбца:

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 голосов
/ 30 декабря 2018

Вот возможный подход.Вы можете определить следующую функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...