我有一个熊猫DataFrame与“日期”列。现在我需要过滤掉DataFrame中日期在未来两个月之外的所有行。实际上,我只需要保留接下来两个月内的行。

实现这一目标的最佳方式是什么?


当前回答

如果你的日期是通过导入datetime包来标准化的,你可以简单地使用:

df[(df['date']>datetime.date(2016,1,1)) & (df['date']<datetime.date(2016,3,1))]  

使用datetime包来标准化你的日期字符串,你可以使用这个函数:

import datetime
datetime.datetime.strptime

其他回答

因此,在加载csv数据文件时,我们需要将日期列设置为索引,如下所示,以便根据日期范围筛选数据。现在已弃用的方法:pd.DataFrame.from_csv()不需要这样做。

如果您只想显示1月至2月两个月的数据,例如2020-01-01至2020-02-29,您可以这样做:

import pandas as pd
mydata = pd.read_csv('mydata.csv',index_col='date') # or its index number, e.g. index_col=[0]
mydata['2020-01-01':'2020-02-29'] # will pull all the columns
#if just need one column, e.g. Cost, can be done:
mydata['2020-01-01':'2020-02-29','Cost'] 

这已经在Python 3.7中进行了测试。希望这对你有用。

根据我的经验,前面的答案是不正确的,你不能传递一个简单的字符串,需要一个datetime对象。所以:

import datetime 
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]

用pyjanitor怎么样

它有很酷的功能。

pip后安装pyjanitor

import janitor

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

如果您的datetime列具有Pandas datetime类型(例如datetime64[ns]),为了进行适当的过滤,您需要pd。时间戳对象,例如:

from datetime import date

import pandas as pd

value_to_check = pd.Timestamp(date.today().year, 1, 1)
filter_mask = df['date_column'] < value_to_check
filtered_df = df[filter_mask]

我还不允许写评论,所以我会写一个答案,如果有人读了所有的评论,并找到了这个。

如果数据集的索引是一个日期时间,并且您想仅通过(例如)月份过滤它,您可以执行以下操作:

df.loc[df.index.month == 3]

它将在3月份为您过滤数据集。