Answers:
如果date列是索引,则将.loc用于基于标签的索引,将.iloc用于位置索引。
例如:
df.loc['2014-01-01':'2014-02-01']
在此处查看详细信息http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection
如果列不是索引,则有两个选择:
df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]
有关一般说明,请参见此处
注意:不建议使用.ix。
query
在这里使用。df.query('20130101 < date < 20130201')
。
.loc
和.ix
)和列过滤器是不等效的。df.ix['2014-01-01':'2014-02-01']
包含2014-02-01
,df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')]
但不包含2013-02-01
,则最多只能匹配行2013-01-31
。
根据我的经验,上一个答案是不正确的,您不能将其传递为简单的字符串,而必须是datetime对象。所以:
import datetime
df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)]
如果您的datetime列具有Pandas datetime类型(例如datetime64[ns]
),则为了进行正确的过滤,您需要pd.Timestamp对象,例如:
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.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
看一下DataFrame.query的pandas文档,特别是有关本地变量引用的udsing @
前缀的提及。在这种情况下,我们pd.Timestamp
使用本地别名ts
进行引用,以便能够提供时间戳字符串
因此,在加载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进行了测试。希望您会发现这个有用。
index_col
必须string
不是清单。mydata = pd.read_csv('mydata.csv',index_col='date')
按日期过滤数据框的最短方法:假设您的日期列为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']
您可以通过执行以下操作来选择时间范围:df.loc ['start_date':'end_date']
如果您已经使用pd.to_datetime将字符串转换为日期格式,则可以使用:
df = df[(df['Date']> "2018-01-01") & (df['Date']< "2019-07-01")]