Найти диапазон дат перекрытия в Python и вернуть перекрытие - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над такой же проблемой, как [здесь] [1] У меня есть фрейм данных с двумя столбцами даты и времени, и мне нужно будет определить совпадения.

import pandas as pd
from datetime import datetime
df = pd.DataFrame(columns=['id','from','to'], index=range(5), \
                  data=[[878,'2006-01-01','2007-10-01'],
                        [878,'2007-10-02','2008-12-01'],
                        [878,'2008-12-02','2010-04-03'],
                        [879,'2010-04-04','2199-05-11'],
                        [879,'2016-05-12','2199-12-31']])

df['from'] = pd.to_datetime(df['from'])
df['to'] = pd.to_datetime(df['to'])

Следующее работает в значительной степени для определения наличия перекрытий как двоичной переменной

df['overlap'] = (df.groupby('id')
                   .apply(lambda x: (x['to'].shift() - x['from']) > pd.Timedelta(seconds=0))
                   .reset_index(level=0, drop=True))

, который возвращает (правильно):

[49]: 
    id       from         to  overlap
0  878 2006-01-01 2007-10-01    False
1  878 2007-10-02 2008-12-01    False
2  878 2008-12-02 2010-04-03    False
3  879 2010-04-04 2199-05-11    False
4  879 2016-05-12 2199-12-31     True

Теперь я хотел бы расширить решение, сохраняя начало перекрытия и конец перекрытия всякий раз, когда происходит перекрытие. Я пытался заставить приложение вернуть pd.Series как в

df.groupby('id').apply(lambda x: 
pd.Series([x['to'].shift() - x['from'] > pd.Timedelta(seconds=0),
x['from'], 
x['to'].shift()],
index=['is_overlap','start_overlap','end_overlap']))

Но полученный фрейм данных представляет собой полностью измененную форму (больше не 5 строк). Я просто хотел

[49]: 
        id       from         to  is_overlap    start_overlap   end_overlap
    0  878 2006-01-01 2007-10-01    False    np.NaT       np.NaT
    1  878 2007-10-02 2008-12-01    False    np.NaT       np.NaT
    2  878 2008-12-02 2010-04-03    False    np.NaT       np.NaT
    3  879 2010-04-04 2199-05-11    False    np.NaT       np.NaT
    4  879 2016-05-12 2199-12-31     True    2016-05-12   2199-05-11

  [1]: https://stackoverflow.com/questions/42462218/find-date-range-overlap-in-python
...