Выберите строки, которые лежат в пределах дат / времени - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь сравнить два фрейма данных и удалить строки из первого фрейма данных, которые не находятся между датами во втором фрейме данных (или ... выбрать те строки, которые равны между датами во 2-м кадре данных).Выборы должны быть включительно.Это может быть очень просто, но это просто не для меня сейчас.

Пример данных ниже.Для кадра данных 1 его можно сгенерировать, используя ежедневные данные, начиная с 1 июля 2018 года и заканчивая 30 ноября 2018 года со случайными числами в столбце «число».... в кадре данных 1 предназначены для отображения пропущенных данных, но данные есть в реальном кадре данных.

Кадр данных 1:

               Number
Date
2018-07-01     15.2
2018-07-02     17.3
2018-07-03     19.5
2018-07-04     13.7
2018-07-05     19.1
...
2018-09-15     30.4
2018-09-16     25.7
2018-09-17     21.2
2018-09-18     19.7
2018-09-19     23.4
...
2018-11-01     30.8
2018-11-02     47.2
2018-11-03     25.3
2018-11-04     39.7
2018-11-05     43.8

Кадр данных 2:

              Change
Date
2018-07-02     Start
2018-07-04     End
2018-09-16     Start
2018-09-18     End
2018-11-02     Start
2018-11-04     End

В приведенном выше примере результат должен быть:

               Number
Date
2018-07-02     17.3
2018-07-03     19.5
2018-07-04     13.7
2018-09-16     25.7
2018-09-17     21.2
2018-09-18     19.7
2018-11-02     47.2
2018-11-03     25.3
2018-11-04     39.7

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете построить IntervalIndex из индекса df2 и выполнить поиск по логарифмическому времени.

df2.index = pd.to_datetime(df2.index)
idx = pd.IntervalIndex.from_arrays(df2.index[df.Change == 'Start'], 
                                   df2.index[df.Change == 'End'],
                                   closed='both')

df1[idx.get_indexer(pd.to_datetime(df1.index)) > -1]

            Number
Date              
2018-07-02    17.3
2018-07-03    19.5
2018-07-04    13.7
2018-09-16    25.7
2018-09-17    21.2
2018-09-18    19.7
2018-11-02    47.2
2018-11-03    25.3
2018-11-04    39.7
0 голосов
/ 12 декабря 2018

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

df3 = pd.concat([df[i:j] for i,j in zip(df2.loc[df2['Change']=='Start'].index, df2.loc[df2['Change']=='End'].index)]))
             Number
Date              
2018-07-02    17.3
2018-07-03    19.5
2018-07-04    13.7
2018-09-16    25.7
2018-09-17    21.2
2018-09-18    19.7
2018-11-02    47.2
2018-11-03    25.3
2018-11-04    39.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...