Нахождение временных меток из списка находится между диапазоном дат в кадре данных - PullRequest
0 голосов
/ 27 марта 2020

У меня есть дата-метки времени (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 просто невозможны.

1 Ответ

1 голос
/ 27 марта 2020

Если бы у вас была только одна строка и ls1 в виде списка, то сработала бы следующая функция:

def to_keep(row):
    global ls1
    start = row['start_time']
    end = row['end_time']
    return any(start <= time <= end for time in ls1)

Теперь давайте создадим маску, которая будет иметь значение True, если мы хотим сохранить строку кадра данных и False в противном случае.

mask = df1[['start_time', 'end_time']].apply(to_keep, axis=1)

Наконец, мы можем оставить только необходимые записи:

df1 = df1[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...