Как отфильтровать фрейм данных Pandas по метке времени, используя .query () - PullRequest
3 голосов
/ 02 апреля 2020

Я пытаюсь отфильтровать Pandas df по датам (сегодня и вчера). Для целей автоматизации я sh должен фильтровать, используя функцию отметки времени. Это довольно легко в R:

df %>% 
  filter(date >= today() - 1)

Однако мои попытки реплицироваться в Pandas пока не достигают успеха: вчерашний день выдался удачным, но .query () его не распознает?

yesterday = (date.today() - timedelta(days=6)).strftime('%Y-%m-%d')
df.\
   query('date >= yesterday')

В идеале я ищу что-то такое, как:

df.\
   query('date >= (date.today() - timedelta(days=6)).strftime('%Y-%m-%d')')

Ответы [ 3 ]

4 голосов
/ 02 апреля 2020

Попробуйте: df.query('date >= @yesterday'). Вам нужно @, чтобы pandas распознал, что это переменная.

3 голосов
/ 02 апреля 2020

IIU C, вы хотите создать внешнюю переменную для использования внутри вашего запроса?

из документов

You can refer to variables in the environment by prefixing them with an ‘@’ character like @a + b.

используя pandas только

import pandas as pd

df = pd.DataFrame({'date' : pd.date_range('01-02-2020','01-03-2021',freq='D')})
df = df.set_index('date')

delta = (pd.Timestamp('today') - pd.DateOffset(days=1)).strftime('%d-%m-%y')

df.query(f"date <= @delta")

  date
  2020-01-02
  2020-01-03
  2020-01-04
  2020-01-05
  2020-01-06
2 голосов
/ 02 апреля 2020

вы можете сделать это с форматированием строки:

df.query(f'date>= "{pd.Timestamp.today() - pd.Timedelta(days=6)}"')

Примечание: я пробовал с pd.Timestamp и pd.Timedelta, но я уверен, что он будет работать с date и timedelta, как вы б

...