在日期上过滤Pandas数据框

345

我有一个Pandas DataFrame,其中有一个“date”列。现在我需要过滤掉DataFrame中所有日期超出未来两个月的行。本质上,我只需要保留在未来两个月内的行。

如何最好地实现这一目标?

16个回答

5
import pandas as pd

步骤1:使用pd.to_datetime()将日期列转换为Pandas日期时间格式。

df['date']=pd.to_datetime(df["date"],unit='s')

步骤2:以任何预定的方式(例如2个月)执行过滤。

df = df[(df["date"] >"2022-03-01" & df["date"] < "2022-05-03")]

5

您可以通过以下方式选择时间范围:df.loc['开始日期':'结束日期']


4
在 Pandas 版本 1.1.3 中,我遇到了一个问题,即 Python 基于日期时间的索引是降序的。在这种情况下,
df.loc['2021-08-01':'2021-08-31']

返回为空。然而

df.loc['2021-08-31':'2021-08-01']

返回了预期数据。


4

使用pyjanitor怎么样呢?

它有许多很酷的功能。

pip install pyjanitor之后即可使用。

import janitor

df_filtered = df.filter_date(your_date_column_name, start_date, end_date)

ValueError: 一个Series的真值是模棱两可的。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。 - mah65

3

如果您想使用.query()方法,另一种解决方案是可行的。

它允许您编写易读的代码,例如.query(f"{start} < MyDate < {end}"),但需要权衡考虑,.query()会解析字符串,且列值必须采用pandas日期格式(以便.query()能够理解)。

df = pd.DataFrame({
     'MyValue': [1,2,3],
     'MyDate': pd.to_datetime(['2021-01-01','2021-01-02','2021-01-03'])
})
start = datetime.date(2021,1,1).strftime('%Y%m%d')
end = datetime.date(2021,1,3).strftime('%Y%m%d')
df.query(f"{start} < MyDate < {end}")

(根据@Phillip Cloud的评论,@Retozi的回答如下)

2
# 60 days from today
after_60d = pd.to_datetime('today').date() + datetime.timedelta(days=60)
# filter date col less than 60 days date
df[df['date_col'] < after_60d]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接