在日期过滤Pandas DataFrames

时间:2014-04-06 19:24:42

标签: python datetime pandas filtering dataframe

我有一个带有' date'的Pandas DataFrame。柱。现在我需要过滤掉DataFrame中具有接下来两个月之外的日期的所有行。基本上,我只需要保留未来两个月内的行。

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

13 个答案:

答案 0 :(得分:146)

如果日期列是索引,则使用.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')]
  3. 有关一般说明,请参阅here

    注意:.ix已弃用。

答案 1 :(得分:34)

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

{{1}}

答案 2 :(得分:24)

如果您的日期是通过导入日期时间包标准化的,您只需使用:

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

要使用datetime包标记日期字符串,您可以使用此功能:

import datetime
datetime.datetime.strptime

答案 3 :(得分:13)

如果您的日期时间列具有Pandas日期时间类型(例如datetime64[ns]),为了正确过滤,您需要pd.Timestamp object,例如:

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]

答案 4 :(得分:10)

如果日期在索引中,则只需:

df['20160101':'20160301']

答案 5 :(得分:6)

因此,在加载csv数据文件时,我们需要如下所示将date列设置为索引,以便根据日期范围过滤数据。对于现在不建议使用的方法,不需要使用此方法:pd.DataFrame.from_csv()。

如果您只想显示从一月到二月的两个月的数据,例如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。希望您会发现这个有用。

答案 6 :(得分:5)

如果您已经使用pd.to_datetime将字符串转换为日期格式,则可以使用:

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

答案 7 :(得分:2)

如何使用pyjanitor

它具有很酷的功能。

pip install pyjanitor

之后
import janitor

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

答案 8 :(得分:2)

按日期过滤数据框的最短方法: 假设您的日期列是datetime64 [ns]

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

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

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

答案 9 :(得分:1)

目前还不允许我发表任何评论,所以如果有人可以阅读所有评论并达到目的,我将写一个答案。

如果数据集的索引是日期时间,而您只想按(例如)个月过滤,则可以执行以下操作:

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

这将在三月之前为您过滤数据集。

答案 10 :(得分:0)

您可以使用pd.Timestamp执行查询和本地引用

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

如果您想使用 .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 的回答)

相关问题