Можно ли использовать Pandas Overlap в Dataframe? - PullRequest
1 голос
/ 01 октября 2019

Python 3.7, Pandas 25

У меня есть Pandas Dataframe со столбцами для начальной и конечной даты. Я ищу диапазоны, которые перекрывают диапазон моих переменных. Не вдаваясь в подробности и составляя серию операторов «больше / меньше» с ands / ors, чтобы отфильтровать нужные мне строки, я бы хотел использовать некоторый интервал «перекрытия». Похоже, что Pandas обладает такой функциональностью:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Interval.overlaps.html

Следующий тест работает:

range1 = pd.Interval(pd.Timestamp('2017-01-01 00:00:00'),pd.Timestamp('2018-01-01 00:00:00'),closed='both')
range2 = pd.Interval(pd.Timestamp('2016-01-01 00:00:00'),pd.Timestamp('2017-01-01 00:00:00'),closed='both')
range1.overlaps(range2)

Однако, когда я иду применить его к столбцам данных, он делаетне. Я не уверен, что в моем синтаксисе что-то не так, или это просто нельзя применить к кадру данных. Вот некоторые из вещей, которые я попробовал (и получил всю гамму ошибок):

start_range = '2017-07-01 00:00:00'
end_current = '2019-07-01 00:00:00'
reporttest_range = pd.Interval(pd.Timestamp(start_range),pd.Timestamp(end_current),closed='both')
reporttest_filter = my_dataframe[my_dataframe['startdate']['enddate'].overlaps(reporttest_range)]
reporttest_filter = my_dataframe[my_dataframe['startdate','enddate'].overlaps(reporttest_range)]
reporttest_filter = my_dataframe[(my_dataframe['startdate','enddate']).overlaps(reporttest_range)]
reporttest_filter = my_dataframe.filter(['startdate','enddate']).overlaps(reporttest_range)
reporttest_filter = my_dataframe.filter['startdate','enddate'].overlaps(reporttest_range)
reporttest_filter = my_dataframe.filter(['startdate','enddate']).overlaps(reporttest_range)
print(reporttest_filter)

Может кто-нибудь указать мне эффективный способ сделать это?

В соответствии с просьбой,Вывод данных кадра выглядит так:

      record    startdate    enddate
0         99    2017-07-01 2018-06-30
1        280    2018-08-01 2021-07-31
2        100    2017-07-01 2018-06-30
3        281    2017-07-01 2018-06-30

1 Ответ

1 голос
/ 02 октября 2019

Вам нужно создать IntervalIndex из df.startdate и df.enddate и использовать overlaps против reporttest_range. Ваш образец возвращает все true, поэтому я добавляю строку для False case.

Sample df:   

   record  startdate    enddate
0    9931 2017-07-01 2018-06-30
1   28075 2018-08-01 2021-07-31
2   10042 2017-07-01 2018-06-30
3   28108 2017-07-01 2018-06-30
4   28109 2016-07-01 2016-12-30
5   28111 2017-07-02 2018-09-30

iix = pd.IntervalIndex.from_arrays(df.startdate, df.enddate, closed='both')
iix.overlaps(reporttest_range)

Out[400]: array([ True,  True,  True,  True, False,  True])

Используйте его, чтобы выбрать только перекрывающиеся строки

df[iix.overlaps(reporttest_range)]

Out[401]:
   record  startdate    enddate
0    9931 2017-07-01 2018-06-30
1   28075 2018-08-01 2021-07-31
2   10042 2017-07-01 2018-06-30
3   28108 2017-07-01 2018-06-30
5   28111 2017-07-02 2018-09-30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...