2014-04-03 65 views
2

我想按日期聚合一個Pandas DataFrame,然後通過日期索引到結果中,但我似乎無法將它編入索引。索引按日期分組的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) 

OK,讓我們嘗試建立索引:

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 a DatetimeIndex或至少PeriodIndex的結果?有辦法讓它成爲一個嗎?

回答

2

該指數是一個日期,因爲你逝去的GROUPBY日期時間的數組:

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 
+0

太棒了,謝謝! –

+1

請注意,'TimeGrouper'已棄用,請改用'Grouper'。 – Primoz