Pandas - 使用查询过滤最近 n 个月的数据

Sey*_*ini 0 python datetime filter pandas

我想根据筛选我的数据帧time使用列的查询功能,并获取行time的最后N一个月(或任何时间段)。

基本上我需要这样的东西:

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

Run Code Online (Sandbox Code Playgroud)

或者

df = df.query("now() >= time >= now() - timeperiod('5M')")
Run Code Online (Sandbox Code Playgroud)

我正在尝试为我的过滤器函数创建查询模式,使用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')
Run Code Online (Sandbox Code Playgroud)

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

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

更新1:

感谢@jezrael,我可以得到这样的now()功能query()

df = df.query("@pd.Timestamp('now') >= time")
Run Code Online (Sandbox Code Playgroud)

当然Timestamp可以用“to_datetime”或其他东西代替。

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

df = df.query("time >= (@pd.Timestamp('now') + @pd.to_timedelta('30day'))")
Run Code Online (Sandbox Code Playgroud)

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

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

但是使用变量来设置目标日期(如@jezrael提到的)是有效的。

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

jez*_*ael 5

使用DateOffset最后N几个月,两个条件都由|for 按位链接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]
Run Code Online (Sandbox Code Playgroud)

没有querywith 的另一种解决方案boolean indexing

df = df[(df.time1 <= pd.to_datetime('now')) & 
        (df.time1 >= pd.to_datetime('now')- pd.DateOffset(months=2))]
Run Code Online (Sandbox Code Playgroud)