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

pandas创建Pivot Table报datetime与int不支持<比较错误

问题现象

基于超大规模数据集创建用于统计计数、求和的Pivot Table时,每次执行创建操作均返回如下报错:

TypeError: '<' not supported between instances of 'datetime.datetime' and 'int'

透视表逻辑使用的所有列从dtype检查结果看均不是datetime类型,已尝试两种代码实现均触发报错。
第一种实现代码:

unused_columns=df4.columns.difference(set(['MATERIAL_C']).union(set(['Cat'])).union(set({'ORDER_QUANTITY'})))
tmp_df = df4.drop(unused_columns, axis=1)
pivot_table = tmp_df.pivot_table(
    index=['MATERIAL_C'],
    columns=['Cat'],
    values=['ORDER_QUANTITY'],
    aggfunc={'ORDER_QUANTITY': ['count']},
    
)
pivot_table.set_axis([flatten_column_header(col) for col in pivot_table.keys()], axis=1, inplace=True)
df3_pivot = pivot_table.reset_index()

第二种简化实现:

countPivot = pd.pivot_table(data = df3,index = ["MATERIAL_C"],columns = ["Cat"],values = "ORDER_QUANTITY",aggfunc = "count")

已检查数据框各列dtype,结果如下:

SO-Item                      int64
MATERIAL_C                  object
ORDER_QUANTITY             float64
REQUESTED_DELIVERY_DATE      int64
DELIVERY_DATE                int64
Months                       int32
Cat                         object

因数据集体量极大,普通pandas逻辑手动构造数据框耗时极长,需要低开销的修复方案。

故障原因
  • pandas pivot_table 默认会对index、columns传入的字段做排序操作,排序过程中会逐值比较大小。列dtype显示为object不代表列内值类型完全统一,object是pandas的混合类型通用标识,只要列内混入了少量datetime对象和int/str值,排序比较时就会触发该类型错误。
  • 即使手动drop了非透视用到的列,只要Cat或MATERIAL_C列内部存在混合类型值,就会触发报错,和其他未参与透视的日期列无直接关联。
修复步骤
  1. 先统一参与透视的三列数据类型,该操作是向量化执行,超大数据集下也几乎无额外开销:
    # 分类列统一转字符串,彻底杜绝混合类型问题
    df4['MATERIAL_C'] = df4['MATERIAL_C'].astype(str)
    df4['Cat'] = df4['Cat'].astype(str)
    # 数值列强制转数值类型,异常值置空后补0,避免隐式类型转换
    df4['ORDER_QUANTITY'] = pd.to_numeric(df4['ORDER_QUANTITY'], errors='coerce').fillna(0)
    
  2. 透视表传入sort=False参数,关闭内部默认的排序逻辑,既可以绕开类型比较的报错点,还能大幅降低超大数据集下透视表的计算耗时:
    修改后的可直接运行的代码:
    countPivot = pd.pivot_table(
        data = df4,
        index = ["MATERIAL_C"],
        columns = ["Cat"],
        values = "ORDER_QUANTITY",
        aggfunc = "count",
        sort=False
    )
    
  3. 如果执行完前两步仍报错,运行下面一行代码即可快速定位Cat列内的值类型分布,无需遍历全量数据做抽样排查:
    print(df4['Cat'].apply(type).value_counts())
    
    若输出结果中存在datetime.datetime类型的计数,将对应异常值统一转换为字符串或过滤即可。

内容的提问来源于stack exchange,提问作者Andrew Robinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:09:20