具体表现

读取 xlsx 后发现日期列全是四五位整数,直接 to_datetime 又报越界,无法用于按月统计。

先判断哪一层出错

Excel 内部用 1899-12-30 起算的序列号存日期,纯数字列不会被自动识别成时间类型。判断时先分清是 Excel 日期序列号 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

操作步骤

  1. 确认该列是否为数值型
  2. 以序列号起点做单位换算
  3. 解析后再校验时区与格式

对应的命令或配置片段如下,可直接复制:

df = pd.read_excel('a.xlsx')
df['日期'] = pd.to_datetime('1899-12-30') + pd.to_timedelta(df['日期'], unit='D')
print(df['日期'].dt.to_period('M').value_counts())

测试环境复现不了时,先对比两边的版本号和配置文件,差异往往就在被忽略的那几行里。如果同一现象隔一段时间又出现,多半是某个定时任务或重启流程把配置覆盖回去了,顺手查一遍启动脚本。

收尾检查

转换后的日期与 Excel 里显示的年月日一致,按月分组结果合理。

作者 9823189