You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas为datetime时间添加时段分类时pd.cut报错解决方案

报错原因

两个报错本质都是类型不匹配导致的:

  1. AttributeError: 'Series' object has no attribute 'date':调用时间相关方法的列/索引没有被pandas识别为datetime类型,本质还是object/字符串格式。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:21:59