DataFrame按小时分组datetime数据报错:AttributeError问题解决
解决DataFrame按小时分组的AttributeError问题
嘿,我知道你为啥踩坑了!你写的代码里有个容易忽略的细节——当你对casa_consumo['date']这个Series用groupby(lambda x: x.hour)时,lambda里的x根本不是date列的时间值,而是Series的整数索引!这就难怪会报'int' object has no attribute 'hour'的错了,哪怕你的date列确实是datetime64[ns]类型。
给你几个简单好用的正确解法:
方法1:直接提取小时作为分组键
利用pandas datetime类型的dt.hour属性,直接提取每个时间的小时数,以此作为分组依据:
# 对整个DataFrame按小时分组,计算各列均值 casa_consumo_h = casa_consumo.groupby(casa_consumo['date'].dt.hour).mean()
方法2:新增小时列后分组
如果需要更直观的分组标识,可以先给DataFrame新增一个hour列,再按这个列分组:
# 新增小时列 casa_consumo['hour'] = casa_consumo['date'].dt.hour # 按小时列分组求均值 casa_consumo_h = casa_consumo.groupby('hour').mean()
方法3:用Grouper按时间区间分组
如果想要保留完整的时间区间索引(比如2017-08-01 00:00:00而不是单纯的0),可以用pd.Grouper指定小时频率:
import pandas as pd # 按小时时间区间分组,索引为每个小时的起始时间 casa_consumo_h = casa_consumo.groupby(pd.Grouper(key='date', freq='H')).mean()
补充说明:
dt.hour是pandas专为datetime类型Series提供的属性,能快速提取小时数,返回的是整数类型的Series,完美适配分组需求。- 你之前的代码里对
date列求均值其实意义不大,上面的方法默认会对所有数值列(比如Ac、f、I这些)计算均值,这应该才是你真正想要的结果~
内容的提问来源于stack exchange,提问作者may
相关产品推荐
相关产品推荐

