我想使用 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所述)。
我将使用变量,因为我现在看不到其他任何方式,但是我将保持开放状态,以查看是否有更好的方法。
答案 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]
没有query
和boolean indexing
的另一种解决方案:
df = df[(df.time1 <= pd.to_datetime('now')) &
(df.time1 >= pd.to_datetime('now')- pd.DateOffset(months=2))]