У меня есть дата-метки времени (df1) и большой список меток времени (ls1).
Я хочу отфильтровать все строки из df1, время начала и окончания которых не охват любое значение из ls1.
Другими словами, если любое значение из ls1 равно между значением start_time и end_time из df1, то оставьте эту строку в df1.
Критическая проблема I не может пройти мимо, что они не одинаковой длины, поэтому сравнение их не работает. Вот что у меня есть.
Настройка:
df1 = pd.DataFrame([['2019-02-20 04:40','2019-02-20 19:35'],
['2019-03-25 03:40','2019-03-25 22:35'],
['2019-05-10 08:00','2019-05-11 02:55'],
['2019-05-16 01:00','2019-05-17 00:55'],
['2019-05-22 02:25','2019-05-22 19:20'],
['2019-06-27 04:05','2019-06-27 22:00']],
columns = ['start_time', 'finish_time']).apply(pd.to_datetime)
df1['data'] = np.random.rand(len(df1)) # adding for aesthetics
ls1 = ['2019-02-01 00:05', '2019-02-14 15:50', '2019-03-04 11:00',
'2019-03-15 03:25', '2019-03-29 05:00', '2019-04-11 00:10',
'2019-04-26 13:35', '2019-05-04 12:45', '2019-05-10 16:45',
'2019-05-10 16:50', '2019-05-10 17:45', '2019-05-10 18:25',
'2019-05-12 05:55', '2019-05-15 11:00', '2019-05-18 07:20',
'2019-06-02 12:10', '2019-06-14 19:30', '2019-06-21 03:00']
ls1 = pd.to_datetime(pd.Series(ls1))
Что я пробовал:
df1.loc[(df1.start_time < ls1.values) & (df1.finish_time > ls1.values)]
и
ls1.between(df1.start_time.values,df1.finish_time.values, inclusive=False)
Оба из них дают: ValueError: Lengths must match
Желаемый результат состоит в том, чтобы идентифицировать элементы из ls1, которые соответствуют критериям:
2019-05-10 16:45:00
2019-05-10 16:50:00
2019-05-10 17:45:00
2019-05-10 18:25:00
, а затем использовать это для фильтрации df1 только по соответствующим row:
start_time finish_time data
2 2019-05-10 08:00:00 2019-05-11 02:55:00 0.691208
Я предполагаю, что функция Pandas isin () была бы идеальной, если бы она не искала явные совпадения?
Любая помощь Следует принимать во внимание, поскольку это очень большой набор данных, и вложенные циклы for просто невозможны.