在groupby之后创建日期时间索引

时间:2015-09-11 12:11:57

标签: python pandas

我想在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

所需的输出是DateTime索引:

                 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

在我的文件中有一些缺失的行,所以我不能用1小时的步长创建一个新的索引。

我的数据分组后Example data

1 个答案:

答案 0 :(得分: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