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提到的)是有效的。
我将使用变量,因为我现在看不到任何其他方式,但我会保留这个问题,看看是否有更好的方法。
使用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)