Python Pandas timeseries groupby使用TimeGrouper

Python Pandas timeseries groupby使用TimeGrouper,python,pandas,time-series,Python,Pandas,Time Series,我有一个这样的时间序列 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-0

我有一个这样的时间序列

            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

如何实现这一点?

我认为您需要首先在
索引中添加
时间
列:

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
感谢您的另一个想法
重新采样

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
编辑:

对于
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

修改后的
df.index
:-)的解决方案很好。对于聚合,您也可以使用
df.resample(“H”).mean()
,而不需要groupby,这是一个更简单的解决方案。很好的解决方案。现在,我的数据集有全年的数据,我想计算所有月份所有小时的平均值,这样我有24个点,但平均值是一年中所有小时的,例如,第一个小时得到所有月份第一个小时的平均值。我怎样才能做到这一点?你能添加一些具有所需输出的样本吗?因为我不确定我是否理解你。谢谢。
2014 00:00:00 2845.5 2014 01:00:00 2657.5 2014 02:00:00 2423.0
因为评论的格式很糟糕。谢谢
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