Как получить раздел Dataframe, который соответствует определенным критериям? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу получить раздел данных, соответствующий определенным требованиям.

Я хочу сделать:

new_df = old_df[old_df.timevariable.date() == thisdateiwant]

Есть ли эффективный способ сделать это, который работает?проблема здесь в части .date ().Я сделал это прежде, чем использовать тот же синтаксис, но не с модификатором со стороны old_df.Например, old_df.timevariable - это дата и время, тогда я могу сопоставить это с ==datetime, но, поскольку я хочу дату, мне нужно изменить каждый элемент в кадре данных, что не нравится синтаксису.

Я знаю, что мог бы взять все это и сделать цикл с кучей переменных, но я уверен, что это будет намного медленнее.Первый фрагмент кода, казалось, был самым быстрым способом сделать это (например, предложение WHERE SQL), хотя, похоже, не работает, если вам нужно изменить сравниваемую переменную (например, .date ()).

Файл old_df имеет размер (900 КБ, 15), поэтому я хочу получить что-то эффективное.В настоящее время я просто меняю переменные и повторно импортирую из SQL, который, кажется, занимает 5-10 секунд для каждой даты (thisdateiwant).Я предполагаю, что что-то в python с большей исходной базой данных будет быстрее, чем это.Обычно он возвращает около 30 тыс. Строк в new_df для каждой даты.

Какой самый быстрый способ сделать это?

Редактировать

Рад отметить, что это дубликат, я получил работу из некоторого кода в этом другом вопросе (из @Pault).в основном сделал:

mask = old_db['timevariable'] >= thisdateiwant
mask2 =  old_db['timevariable'] < thisdateiwant (+1day)
new_db = old_db.loc[mask]
new_db = new_db.loc[mask2]

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

1 Ответ

0 голосов
/ 05 июня 2018

если ваш столбец действительно является временной меткой, тогда вы можете использовать аксессор dt.

new_df = old_df[old_df.timevariable.dt.floor('D') == '2018-05-09']

в противном случае измените целевой столбец на временную метку, используя pd.to_datetime

old_df[timevariable] = pd.to_datetime(old_df[timevariable])

диапазоны дат поддерживаются более естественным образом без средства доступа dt

new_df = old_df[old_df.timevariable >= '2018-05-09'] <- dates after may 9th inclusive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...