Pandas эквивалент between_time для Dask DataFrame - PullRequest
1 голос
/ 19 июня 2020

У меня есть фрейм данных Dask, созданный с помощью dd.read_csv("./*/file.csv"), где * glob - это папка для каждой даты. В объединенном фрейме данных я хочу отфильтровать подмножества времени, как, например, с pd.between_time("09:30", "16:00"), скажем.

Поскольку внутреннее представление индекса Dask не имеет хороших функций DateTimeIndex Pandas , У меня не было никакого успеха с фильтрацией, как обычно в Pandas. Если не прибегать к простой функции сопоставления / l oop, я не могу заставить это работать в Dask.

Поскольку разделы созданы по дате, возможно, это можно было бы использовать путем преобразования в Pandas dataframe, а затем обратно в раздел Dask, но похоже, что должен быть лучший способ.


Обновление с использованием примера, использованного в ответе Ангуса.

enter image description here

Думаю, я не понимаю лог c запросов в ответах / комментариях. Достаточно ли умен Pandas, чтобы не интерпретировать логическую маску буквально как строку и проводить правильные сравнения даты и времени?

1 Ответ

1 голос
/ 19 июня 2020

Фильтрация в Dask работает так же, как pandas, с удалением нескольких вспомогательных функций.

Например, если у вас были следующие данные:

time,A,B
6/18/2020 09:00,29,0.330799201
6/18/2020 10:15,30,0.518081116
6/18/2020 18:25,31,0.790506469

Следующий код:

import dask.dataframe as dd

df = dd.read_csv('*.csv', parse_dates=['time']).set_index('time')
df.loc[(df.index > "09:30") & (df.index < "16:00")].compute()

(при запуске 18 июня 2020 г.) вернет:

time,A,B
2020-06-18 10:15:00,30,0.518081

РЕДАКТИРОВАТЬ:

Вышеупомянутые фильтры ответов только для текущей даты; pandas интерпретирует строку времени как значение datetime с текущей датой. Если вы хотите отфильтровать значения для всех дней между указанными c временами, существует обходной путь для удаления даты из столбца datetime:

import dask.dataframe as dd

df = dd.read_csv('*.csv',parse_dates=['time'])
df["time_of_day"] = dd.to_datetime(df["time"].dt.time.astype(str))
df.loc[(df.time_of_day > "09:30") & (df.time_of_day < "16:00")].compute()

Имейте в виду, что этот метод может иметь штраф за скорость , возможно, проблема для больших наборов данных.

...