pandas为datetime时间添加时段分类时pd.cut报错解决方案
报错原因
两个报错本质都是类型不匹配导致的:
AttributeError: 'Series' object has no attribute 'date':调用时间相关方法的列/索引没有被pandas识别为datetime类型,本质还是object/字符串格式。ValueError: bins must be of datetime64 dtype:传入pd.cut的待分箱对象是datetime64类型的时间数据,但传入的分箱边界是纯整数,两者类型无法匹配计算。
正确实现方案
不要直接对完整的datetime时间戳做分箱,先提取时间戳的小时值(0-23的整数),再对整数做分箱即可,全程保证类型一致。
步骤1:先统一时间格式
不管时间是存为普通列还是索引,先转成pandas标准datetime格式:
import pandas as pd # 如果Date-Time是普通列,执行这行 df['Date-Time'] = pd.to_datetime(df['Date-Time']) # 如果Date-Time被设为了索引,执行这行 # df.index = pd.to_datetime(df.index)
步骤2:提取小时值分箱打标签
分箱时直接对小时整数做切割,可以根据自己的时段定义自由调整分箱边界和对应标签,注意区间开闭规则即可。
# 以下分箱规则为示例:[0,6)为night,[6,12)为morning,[12,18)为afternoon,[18,24)为evening df['Class'] = pd.cut( x=df['Date-Time'].dt.hour, # 提取小时整数,和数值分箱边界类型匹配 bins=[0, 6, 12, 18, 24], labels=['night', 'morning', 'afternoon', 'evening'], include_lowest=True, right=False # 配置区间为左闭右开,符合日常时段划分的认知 )
如果需要匹配自己给出的示例标签规则,只需要调整bins和labels的对应关系即可,比如要让0-12点归为morning、18-24点归为night,修改为如下参数即可:
bins=[0, 12, 18, 24], labels=['morning', 'afternoon', 'night']
方案说明
- 提前转datetime格式可以避免所有时间类方法调用的属性错误,后续提取年、月、日、分钟等维度也可以直接用
.dt接口实现。 - 用小时整数做分箱完全避开了datetime类型和数值类型不匹配的问题,逻辑简单运行效率高。
- 通过
right参数可以灵活调整区间边界的归属,避免出现23:59:59这类边界点分类错误的问题。
内容的提问来源于stack exchange,提问作者M R
相关产品推荐
相关产品推荐

