2015-09-11 28 views
1

我想在groupby函數後恢復索引。創建羣組後的日期時間索引

問題是如何在Multindex中的單獨列中創建具有年,月,日的DateTime索引。

給出一個DataFrame爲例:

import pandas as pd 
import numpy as np 

index=pd.date_range('2011-1-1 00:00:00', '2011-1-31 23:50:00', freq='10min') 
df=pd.DataFrame(np.random.randn(len(index),2).cumsum(axis=0),columns=['A','B'],index=index) 

然後,開始使用grupby在每個小時的總和:

day_h = df.groupby([lambda x: x.year, lambda x: x.month, lambda x: x.day,lambda x: x.hour]).mean() 

這將創建一個索引,其中年,月,日,時的在單獨的列中。

     A   B 
2011 1 1 0 0.209908 1.196164 
2011 1 1 1 0.692531 0.518185 
2011 1 1 2 1.674748 0.013136 
2011 1 1 3 1.674748 0.013136 
2011 1 1 4 1.674748 0.013136 
2011 1 1 5 1.674748 0.013136 

所需的輸出將有日期時間指數:

    A   B 
2011-1-1 00:00 0.209908 1.196164 
2011-1-1 01:00 0.692531 0.518185 
2011-1-1 03:00 1.674748 0.013136 
2011-1-1 04:00 1.674748 0.013136 
2011-1-1 05:00 1.674748 0.013136 

在我的文件有一些遺漏行,所以我不能創建1H時間步長的新指標。

我的數據後GROUPBY Example data

+0

有什麼不對當前DF?該索引顯示相對水平值,因爲您在給定日期有多個小時,輸出正確 – EdChum

+0

此外,您還想在此實現什麼?您的groupby對象與您的示例df沒有區別,因爲這裏的意思相同 – EdChum

+0

是的,這是正確的,但我想擺脫Multindex並具有日期時間索引。 – Michal

回答

1

有人在SO人都有一個similar question,但他們的解決方案是使用重採樣。您可以通過映射多索引中的元組來創建新索引來避免重採樣。這將處理缺失的行就好了。

day_h['new_index'] = day_h.index.map(lambda x: datetime.datetime(x[0], x[1], x[2], x[3])) 
day_h.set_index('new_index') 

輸出:

     A   B 
new_index         
2011-01-01 00:00:00 -1.095114 1.995776 
2011-01-01 01:00:00 -2.411459 4.508794 
2011-01-01 02:00:00 -1.261747 4.953709 
2011-01-01 03:00:00 -0.311934 5.454112 
2011-01-01 04:00:00 2.095718 6.854375 
2011-01-01 05:00:00 1.696756 3.518919 
2011-01-01 06:00:00 0.623589 1.740478 
2011-01-01 07:00:00 0.544426 0.916016 
2011-01-01 08:00:00 2.331326 0.891177 
+0

@Edchum回答中唯一缺少的是魔法'x [0]'等等......謝謝@thecircus! – Michal