pd.to_datetime转换DataFrame object日期触发OutOfBoundsDatetime越界报错
报错根因
- pandas 默认的
datetime64[ns]类型基于64位整数存储纳秒级时间戳,存在固定的取值边界:仅支持公元1677年9月14日 到 公元2262年4月11日之间的时间,超出该范围的时间会直接触发越界错误。 - 当前场景的直接触发原因:源
Inv_Net_Due_Date_new字段存在格式异常的脏值。你指定的转换格式是%Y-%m(匹配标准4位年+2位月的字符串),但报错信息里出现了带具体日期的203-02-19,说明字段内存在被截断的残缺值(比如原本应该是2023-02类的合规值,被截断丢失了字符,变成了3位年份的无效值),被pandas解析后生成了远早于取值边界的时间戳,最终触发报错。
排查与解决步骤
- 第一步:先定位并清洗源字段的异常脏值
用正则匹配筛出所有不符合YYYY-MM格式的异常行,查看具体有哪些无效值:
找到截断、格式错位的脏值后,按照业务规则修正为合规的# 匹配不符合4位年-2位月格式的所有记录 invalid_mask = ~mydata['Inv_Net_Due_Date_new'].str.match(r'^\d{4}-\d{2}$', na=False) # 打印所有唯一的异常值,针对性修正 print(mydata.loc[invalid_mask, 'Inv_Net_Due_Date_new'].unique())YYYY-MM格式,从根源减少转换报错。 - 第二步:转换时增加容错机制,避免单条脏值中断全量流程
如果清洗后仍有少量无法修正的越界值,可以在pd.to_datetime中增加errors='coerce'参数,让无法解析、超出范围的自动转为空值NaT,而非直接抛出异常中断程序:mydata['Inv_Net_Due_Date_new'] = pd.to_datetime( mydata['Inv_Net_Due_Date_new'], format='%Y-%m', errors='coerce' ) - 第三步:如果业务确实需要处理边界外的早/晚期日期
可以调整时间戳的存储精度为秒级,绕开纳秒类型的范围限制:
秒级精度的mydata['Inv_Net_Due_Date_new'] = pd.to_datetime( mydata['Inv_Net_Due_Date_new'], format='%Y-%m', errors='coerce', unit='s' )datetime64[s]支持的时间范围远大于纳秒类型,可覆盖多数长周期历史日期的存储需求。
内容的提问来源于stack exchange,提问作者Yogesh Govindan
相关产品推荐
相关产品推荐

