从dd/mm/yy格式注册日期列提取年份报ParserError超范围问题
错误原因
抛出ParserError: year 44091 is out of range: 44091.57292的核心原因是Registration date列并非全是你认知里的dd/mm/yy hh:mm:ss格式文本,其中混杂了Excel存储日期用的数值型序列号:
- Excel的日期存储规则是将1899-12-30记为起点0,每过1天序列号加1,小数部分对应当天的时分秒占比,你看到的
44091.57292实际对应2020-09-11 13:45左右的时间,是合法的日期存储值。 - 你之前用的日期解析逻辑只适配了
dd/mm/yy hh:mm:ss格式的文本,碰到这类纯数值时,会错误把数值的整数部分识别为年份字段,44091远超出日期类支持的年份范围,直接触发解析报错。 - 这类混存问题一般是读取Excel文件时产生的:列内部分单元格被设为数值格式、部分是文本格式的日期,pandas默认不会自动对类型混杂的列做统一日期转换,会把Excel的原始序列号原样读入DataFrame。
修复步骤
- 不要用默认无参数的日期转换方法硬转整列,需要针对两类存储值分别写解析规则。
- 使用自定义解析函数适配混合格式的日期列,参考实现(pandas数据处理场景):
import pandas as pd def parse_reg_date(val): # 处理数值型Excel日期序列号,origin参数对齐Excel的日期计算规则 if pd.notna(val) and isinstance(val, (int, float)): return pd.to_datetime(val, unit="D", origin="1899-12-30") # 处理文本型dd/mm/yy hh:mm:ss格式日期,明确指定格式避免日月解析错位 return pd.to_datetime(val, format="%d/%m/%y %H:%M:%S", errors="coerce") # 应用到目标列完成datetime类型转换 df["Registration date"] = df["Registration date"].apply(parse_reg_date)
- 转换完成后随机抽取3-5行原报错位置的记录做校验,确认日期解析结果符合业务预期后,直接用
.dt.year就能正常提取年份,不会再触发越界错误。
内容的提问来源于stack exchange,提问作者Aish
相关产品推荐
相关产品推荐

