【问题标题】:How to filter a Pandas dataframe by timestamp functon using .query()如何使用 .query() 通过时间戳函数过滤 Pandas 数据帧
【发布时间】:2020-07-13 19:26:05
【问题描述】:

我正在尝试按日期(今天和昨天)过滤 Pandas df。出于自动化目的,我希望使用时间戳功能进行过滤。这在 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')')

【问题讨论】:

  • 你为什么在 Python 中使用 timedelta(days=6)(六天前)并与在 R 中抓取 昨天(一天前)进行比较?
  • 抱歉,这很混乱,而且是一个错字。因此,出于测试目的,我构建的数据集意味着日期变量在 6 天前结束。抱歉,这似乎有点混乱。

标签: python pandas datetime data-manipulation


【解决方案1】:

试试:df.query('date >= @yesterday')。您需要 @ 以便 pandas 识别出它是一个变量。

【讨论】:

    【解决方案2】:

    IIUC,您想创建一个外部变量以在您的查询中使用吗?

    来自docs

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

    只使用熊猫

    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
    

    【讨论】:

      【解决方案3】:

      你可以用字符串格式化来做到这一点:

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

      注意:我尝试过使用 pd.Timestamppd.Timedelta,但我确信它可以与您使用的 datetimedelta 一起使用

      【讨论】:

        猜你喜欢
        • 2020-06-02
        • 2022-11-30
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 2017-09-08
        • 2019-07-11
        • 1970-01-01
        相关资源
        最近更新 更多