熊猫-使用查询过滤过去n个月中的数据

时间:2020-01-11 06:25:26

标签: python pandas datetime filter

我想使用 query 函数基于time列过滤数据框,并在最近time个月(或任何时间段)中使用N获取行)。

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

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')

样本数据可以包含其他一些列。

我需要使用N函数对数据进行过滤,以获取最近query()个月内每个给定列的记录。例如,我想要最近两个月的time1和最近三个月的time2记录。就像获取过去3个月内被录用并在最近2个月内被释放的人的记录一样。

更新1:

由于@jezrael,我可以在now()中获得query()函数,如下所示:

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所述)。

我将使用变量,因为我现在看不到其他任何方式,但是我将保持开放状态,以查看是否有更好的方法。

1 个答案:

答案 0 :(得分:3)

在过去N个月中使用DateOffset,对于按位|,两个条件都由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))]