【问题标题】:Pandas - filter data that are in last n month using queryPandas - 使用查询过滤过去 n 个月的数据
【发布时间】:2020-04-28 17:23:17
【问题描述】:

我想使用 query 函数根据 time 列过滤我的数据框,并在上一个 N 月(或任何时间段)获取带有 time 的行。

基本上我需要类似的东西:

df = df.query("time.isin(timeperiod('5M'))")

df = df.query("now() >= time >= now() - timeperiod('5M')")

我正在尝试为我的过滤器函数创建查询模式,使用它很重要 query()函数。

请注意,timeperiod()now() 函数不可用,我使用它们是为了更好地理解我想要的解决方案。我的意思是请在您的解决方案中定义这些函数。

示例:

df = pd.DataFrame()
df['time1'] = pd.date_range('1/1/2019', periods=1000, freq='D')
df['time2'] = pd.date_range('1/1/2018', periods=1000, freq='D')

示例数据可以有其他一些列。

我需要使用query() 函数过滤数据以获取每个给定列的最后一个N 月内的记录。例如,我想要过去 2 个月的 time1 和过去 3 个月的 time2 记录。就像获取过去 3 个月内被雇用并在过去 2 个月内被解雇的人员的记录。

更新 1:

感谢@jezrael,我可以像这样在query() 中获得now() 函数:

df = df.query("@pd.Timestamp('now') >= time")

当然,Timestamp 可以替换为 'to_datetime` 或其他内容。

但问题是当我尝试像这样获取周期开始的时间戳时:

df = df.query("time >= (@pd.Timestamp('now') + @pd.to_timedelta('30day'))")

我得到: Cannot convert input ... of type <class 'pandas._libs.tslibs.timedeltas.Timedelta'> to Timestamp

再次使用 DateOffset 或其他时间增量函数会导致类似的错误。

但使用 变量 设置目标日期(如 @jezrael 所述)有效。

我将使用变量,因为我现在看不到任何其他方法,但我会保持这个问题开放,看看是否有更好的方法。

【问题讨论】:

    标签: python pandas datetime filter


    【解决方案1】:

    使用DateOffset 表示最后一个N 个月,这两个条件都由| 链接按位OR

    now = pd.to_datetime('now')
    last2 = now - pd.DateOffset(months=2)
    last3 = now - pd.DateOffset(months=3)
    
    df = df.query("(@now >= time1 >= @last2) | (@now >= time2 >= @last3)")
    print(df)
             time1      time2
    315 2019-11-12 2018-11-12
    316 2019-11-13 2018-11-13
    317 2019-11-14 2018-11-14
    318 2019-11-15 2018-11-15
    319 2019-11-16 2018-11-16
    ..         ...        ...
    736 2021-01-06 2020-01-07
    737 2021-01-07 2020-01-08
    738 2021-01-08 2020-01-09
    739 2021-01-09 2020-01-10
    740 2021-01-10 2020-01-11
    
    [153 rows x 2 columns]
    

    另一个没有queryboolean indexing 的解决方案:

    df = df[(df.time1 <= pd.to_datetime('now')) & 
            (df.time1 >= pd.to_datetime('now')- pd.DateOffset(months=2))]
    

    【讨论】:

    • 它给了我"timeperiod" is not supported function
    • 我编辑了我的问题:我提到了这些函数来显示我在查询中需要什么结构。
    • 其实主要问题是找到timeperiod()now()函数。
    • 我将添加一些数据样本,但我已经测试了last()' function and it doesn't work because in order to use last()' 函数我需要先索引我的数据。
    • 除了索引数据之外,我可能有多个日期时间类型的列,并且每个列都可以进行不同的过滤,
    猜你喜欢
    • 2022-09-27
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2017-03-04
    • 2020-10-09
    • 2019-04-09
    • 2021-09-05
    相关资源
    最近更新 更多