Pandas旧脚本处理新Excel数据时报错的原因排查与修复
报错根因
- 触发
TypeError: '>=' not supported between instances of 'datetime.datetime' and 'str'的核心原因:更新后的数据源中,用于分组统计的日期列存在格式不统一的内容。Pandas读取Excel时,会把同列内的标准datetime值、非标准字符串格式的时间内容自动识别为混合类型,执行max/min聚合计算时,无法跨datetime对象和普通字符串做大小比较,直接抛错中断。 - 导出环节的兼容问题:新版本Pandas对
ExcelWriter的引擎参数做了严格大小写校验,此前兼容的'XlsxWriter'写法不再被识别,会导致后续Excel导出步骤运行失败。
对应修复操作
- 数据源读取完成后,第一时间对参与聚合计算的日期列做强制类型转换,统一用
pd.to_datetime()将该列转为标准datetime类型,从根源避免混合类型比较的报错。如果源数据存在完全无法解析的异常日期值,可以在转换时追加errors='coerce'参数,把识别不了的异常值自动转为空值,保障脚本不会因为个别脏数据中断。 - 将导出代码块中的引擎参数
engine='XlsxWriter'调整为全小写的engine='xlsxwriter',匹配新版本Pandas的参数校验规则。
修复后可运行代码
import pandas as pd #import xlsxwriter data_df = pd.read_excel("OppAvgStageDuration.xlsx") # 统一转换日期列格式 data_df['CloseDate'] = pd.to_datetime(data_df['CloseDate']) data_df['MaxDate'] = data_df.groupby(['OpportunityID', 'OpportunityName', 'ToStage'])['CloseDate'].transform('max') data_df['MinDate'] = data_df.groupby(['OpportunityID', 'OpportunityName', 'ToStage'])['CloseDate'].transform('min') data_df['Difference'] = pd.to_datetime(data_df['MaxDate']) - pd.to_datetime(data_df['MinDate']) agg_df = data_df.groupby(['OpportunityID', 'OpportunityName', 'ToStage']).agg(MaxDate=('CloseDate', 'max'), MinDate=('CloseDate', 'min')).reset_index() agg_df['Difference'] = pd.to_datetime(agg_df['MaxDate']) - pd.to_datetime(agg_df['MinDate']) #data_df.to_json(orient='records') with pd.ExcelWriter('../out/ComputedReportOpps.xlsx', engine='xlsxwriter') as writer: data_df.to_excel(writer, sheet_name='New Computed Data', index=False) agg_df.to_excel(writer, sheet_name='Computed Agg Data', index=False) print(data_df)
内容的提问来源于stack exchange,提问作者Superman
相关产品推荐
相关产品推荐

