按日期分组并聚合索引一个Pandas数据框?
我正在尝试通过日期对一个Pandas数据框进行汇总,然后想根据日期来查找结果,但我发现根本无法查找。
from datetime import date, datetime
import pandas as pd
import numpy as np
ts = pd.DataFrame({'data': np.random.randn(60)}, index=pd.date_range('1/1/2000', periods=60, freq='2h'))
g = ts.groupby(ts.index.date).agg(np.mean)
print(g)
data
2000-01-01 0.090038
2000-01-02 0.099970
2000-01-03 -0.619274
2000-01-04 0.027040
2000-01-05 -0.323205
首先,我本以为索引应该是一个DatetimeIndex
(日期时间索引),但是:
print(g.index)
Index([2000-01-01, 2000-01-02, 2000-01-03, 2000-01-04, 2000-01-05], dtype='object')
g.index[0]
datetime.date(2000, 1, 1)
好吧,让我们试着查找一下:
g['2000-01-01']
KeyError: u'no item named 2000-01-01'
g[date(2000, 01, 01)]
KeyError: u'no item named 2000-01-01'
g[datetime(2000, 01, 01)]
KeyError: u'no item named 2000-01-01 00:00:00'
g[pd.to_datetime('2000-01-01')]
KeyError: u'no item named 2000-01-01 00:00:00'
我甚至连用索引本身都无法查找!
g[g.index[0]]
KeyError: u'no item named 2000-01-01'
我错过了什么呢?为什么汇总的结果不是一个DatetimeIndex
,或者至少不是一个PeriodIndex
(周期索引)呢?有没有办法把它变成这样的索引?
1 个回答
2
这个索引是一个日期时间,因为你在进行分组时传入的是一组日期时间:
In [11]: ts.index.date[:2]
Out[11]: array([datetime.date(2000, 1, 1), datetime.date(2000, 1, 1)], dtype=object)
更常见的做法是重新采样:
In [12]: res = ts.resample('D', how='mean')
In [13]: res
Out[13]:
data
2000-01-01 0.181246
2000-01-02 -0.167023
2000-01-03 -0.075843
2000-01-04 -0.218141
2000-01-05 -0.144635
如果你要做更复杂的事情,可以使用 TimeGrouper:
In [14]: ts.groupby(pd.TimeGrouper('D')).mean()
Out[14]:
data
2000-01-01 0.181246
2000-01-02 -0.167023
2000-01-03 -0.075843
2000-01-04 -0.218141
2000-01-05 -0.144635
这些都有一个索引,叫做 DatetimeIndex。
关于访问行,你应该使用 loc,不过我更喜欢用时间戳来访问:
In [15]: res.loc['2000-01-01'] # KeyError without using loc
Out[15]:
data 0.181246
Name: 2000-01-01 00:00:00, dtype: float64
In [16]: res.loc[pd.Timestamp('2000-01-01')]
Out[16]:
data 0.181246
Name: 2000-01-01 00:00:00, dtype: float64
你可以用这些字符串来切片(但我觉得这不是一个特别稳妥的主意,我更喜欢用时间戳):
In [17]: res['2000-01-01':'2000-01-01']
Out[17]:
data
2000-01-01 0.181246