2017-02-27 199 views
1

GROUPBY我有一个时间序列是这样大熊猫时间序列使用TimeGrouper

  Time Demand 
Date   
2014-01-01 0:00 2899.0 
2014-01-01 0:15 2869.0 
2014-01-01 0:30 2827.0 
2014-01-01 0:45 2787.0 
2014-01-01 1:00 2724.0 
2014-01-01 1:15 2687.0 
2014-01-01 1:30 2596.0 
2014-01-01 1:45 2543.0 
2014-01-01 2:00 2483.0 

其为以15个分钟为增量。我想每天每个小时的平均时间。所以我尝试了这样的df.groupby(pd.TimeGrouper(freq='H')).mean()。它没有完全正确,因为它主要返回NaNs

现在我的数据集全年都有这样的数据,我想计算所有月份所有小时的平均值,这样我有24个点,但平均值是一年中的所有小时数,例如第一个小时就是所有月份的第一个小时的平均值。预期产出将是

2014 00:00:00 2884.0 
2014 01:00:00 2807.0 
2014 02:00:00 2705.5 
2014 03:00:00 2569.5 
.......... 
2014 23:00:00 2557.5 

我该如何实现这一目标?

回答

2

我想你需要首先添加Timeindex

df.index = df.index + pd.to_timedelta(df.Time + ':00') 
print (df) 
        Time Demand 
2014-01-01 00:00:00 0:00 2899.0 
2014-01-01 00:15:00 0:15 2869.0 
2014-01-01 00:30:00 0:30 2827.0 
2014-01-01 00:45:00 0:45 2787.0 
2014-01-01 01:00:00 1:00 2724.0 
2014-01-01 01:15:00 1:15 2687.0 
2014-01-01 01:30:00 1:30 2596.0 
2014-01-01 01:45:00 1:45 2543.0 
2014-01-01 02:00:00 2:00 2483.0 

print (df.groupby(pd.Grouper(freq='H')).mean()) 
#same as 
#print (df.groupby(pd.TimeGrouper(freq='H')).mean()) 
        Demand 
2014-01-01 00:00:00 2845.5 
2014-01-01 01:00:00 2637.5 
2014-01-01 02:00:00 2483.0 

感谢pansen另一个想法resample

print (df.resample("H").mean()) 
        Demand 
2014-01-01 00:00:00 2845.5 
2014-01-01 01:00:00 2637.5 
2014-01-01 02:00:00 2483.0 

编辑:

print (df) 
      Time Demand 
Date      
2014-01-01 0:00  1.0 
2014-01-01 0:15  2.0 
2014-01-01 0:30  4.0 
2014-01-01 0:45  5.0 
2014-01-01 1:00  1.0 
2014-01-01 1:15  0.0 
2015-01-01 1:30  1.0 
2015-01-01 1:45  2.0 
2015-01-01 2:00  3.0 

df.index = df.index + pd.to_timedelta(df.Time + ':00') 
print (df) 
        Time Demand 
2014-01-01 00:00:00 0:00  1.0 
2014-01-01 00:15:00 0:15  2.0 
2014-01-01 00:30:00 0:30  4.0 
2014-01-01 00:45:00 0:45  5.0 
2014-01-01 01:00:00 1:00  1.0 
2014-01-01 01:15:00 1:15  0.0 
2015-01-01 01:30:00 1:30  1.0 
2015-01-01 01:45:00 1:45  2.0 
2015-01-01 02:00:00 2:00  3.0 

df1 = df.groupby([df.index.year, df.index.hour]).mean().reset_index() 
df1.columns = ['year','hour','Demand'] 
print (df1) 
    year hour Demand 
0 2014  0  3.0 
1 2014  1  0.5 
2 2015  1  1.5 
3 2015  2  3.0 

对于DatetimeIndex使用:

df1 = df.groupby([df.index.year, df.index.hour]).mean() 
df1.index = pd.to_datetime(df1.index.get_level_values(0).astype(str) + 
          df1.index.get_level_values(1).astype(str), format='%Y%H') 
print (df1) 
        Demand 
2014-01-01 00:00:00  3.0 
2014-01-01 01:00:00  0.5 
2015-01-01 01:00:00  1.5 
2015-01-01 02:00:00  3.0 
+2

修改后的'df.index' :-)的很好的解决方案。对于聚合,你也可以使用'df.resample(“H”)。mean()'而不需要groupby,这样做更容易一些。 – pansen

+0

不错的解决方案。现在我的数据集全年都有这样的数据,我想计算所有月份所有小时的平均值,这样我有24点,但平均值是一年中的所有小时数,例如第一个小时就能获得所有月份第一个小时的资金。我怎样才能做到这一点? –

+1

你可以添加一些样本与期望的输出?因为我不确定我是否了解你。谢谢。 – jezrael