根据日期过滤Pandas数据框架

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

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

721651 次浏览

如果日期列是索引,则使用.loc进行基于标签的索引,或使用.iloc进行位置索引。

例如:

df.loc['2014-01-01':'2014-02-01']

详见http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

如果列是不是索引,你有两个选择:

  1. 将其作为索引(如果是时间序列数据,可以是临时索引,也可以是永久索引)
  2. df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]

一般解释见在这里

注意:.ix已弃用。

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

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

如果日期在索引中,则简单地:

df['20160101':'20160301']

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

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

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

import datetime
datetime.datetime.strptime

如果你的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]

你可以用pd。时间戳来执行查询和本地引用

import pandas as pd
import numpy as np


df = pd.DataFrame()
ts = pd.Timestamp


df['date'] = np.array(np.arange(10) + datetime.now().timestamp(), dtype='M8[s]')


print(df)
print(df.query('date > @ts("20190515T071320")')

输出

                 date
0 2019-05-15 07:13:16
1 2019-05-15 07:13:17
2 2019-05-15 07:13:18
3 2019-05-15 07:13:19
4 2019-05-15 07:13:20
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25




date
5 2019-05-15 07:13:21
6 2019-05-15 07:13:22
7 2019-05-15 07:13:23
8 2019-05-15 07:13:24
9 2019-05-15 07:13:25

看一下熊猫DataFrame.query的文档,特别是关于使用@前缀引用的局部变量的提到。在本例中,我们使用本地别名ts引用pd.Timestamp,以便能够提供一个时间戳字符串

使用pyjanitor怎么样

它有很酷的功能。

pip install pyjanitor

import janitor


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

因此,在加载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中进行了测试。希望这对你有用。

按日期过滤数据帧的最短方法: 假设你的日期列类型为datetime64[ns]

# filter by single day
df_filtered = df[df['date'].dt.strftime('%Y-%m-%d') == '2014-01-01']


# filter by single month
df_filtered = df[df['date'].dt.strftime('%Y-%m') == '2014-01']


# filter by single year
df_filtered = df[df['date'].dt.strftime('%Y') == '2014']

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

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

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

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

你可以通过执行:df.loc['start_date':'end_date']来选择时间范围

如果您已经使用pd将字符串转换为日期格式。To_datetime你可以使用:

df = df[(df['Date'] > "2018-01-01") & (df['Date'] < "2019-07-01")]

如果你想使用.query()方法,这是另一种解决方案。

它允许你在权衡时使用.query (f"{开始}& lt;替换& lt;{}结束“)这样可读的代码,.query()解析字符串,列值必须是pandas date格式(这样。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的回答)

在pandas版本1.1.3中,我遇到了基于python datetime的索引降序排列的情况。在这种情况下

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

返回空的。而

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

返回预期的数据。

# 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]

导入熊猫文库

进口熊猫作为pd

步骤1:使用pd.to_datetime()方法将日期列转换为字符串

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

第二步:以任何预定的方式进行筛选(即2个月)

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

步骤3:检查输出

 print(df)