如何解决pandas转换不一致日期格式时出现的datetime报错问题
混合格式日期转换报错解决方案
报错原因
你遇到的报错是因为数据集内同时存在%Y-%m-%d(年-月-日)和%Y-%d-%m(年-日-月)两类日期字符串,pd.to_datetime默认按年-月-日规则解析时,会把2010-22-1这类字符串中的22识别为月份,超出1-12的合法范围触发报错。
操作前置要求:先备份原始日期列,避免数据覆盖丢失
df['raw_date'] = df['date'].copy()
可选解决方案
方案1:低占比异常值处理
如果异常格式(年-日-月)的样本占比很低,可先跳过错误再单独修正:
- 第一步:转换日期,异常值临时置为NaT
df['date'] = pd.to_datetime(df['raw_date'], errors='coerce')
- 第二步:单独解析转换失败的异常值
# 筛选转换失败的行 na_mask = df['date'].isna() df.loc[na_mask, 'date'] = pd.to_datetime(df.loc[na_mask, 'raw_date'], format='%Y-%d-%m', errors='coerce')
方案2:双格式自动适配解析
如果两种格式的样本占比都较高,可使用自定义函数自动适配解析规则:
import pandas as pd from datetime import datetime def custom_parse_date(date_str): try: # 优先尝试解析年-月-日格式 return datetime.strptime(date_str, '%Y-%m-%d') except ValueError: try: # 解析失败则尝试年-日-月格式 return datetime.strptime(date_str, '%Y-%d-%m') except ValueError: # 两种格式均不匹配返回空值 return pd.NaT df['date'] = df['raw_date'].apply(custom_parse_date)
方案3:大数据量优化方案
如果数据量超过10万条,可开启自动格式推断提升处理效率:
# 先自动推断格式转换,错误值置空 df['date'] = pd.to_datetime(df['raw_date'], infer_datetime_format=True, errors='coerce') # 处理剩余的转换失败值 na_mask = df['date'].isna() df.loc[na_mask, 'date'] = pd.to_datetime(df.loc[na_mask, 'raw_date'], format='%Y-%d-%m', errors='coerce')
补充说明
如果数据中还存在其他格式变体,可自行调整解析规则:
- 日期用斜杠分隔:将格式符中的
-替换为/,例如%Y/%d/%m - 月/日不带前导零:对应格式符调整为
%Y-%d-%-m(Windows系统下用%Y-%d-%#m)
内容的提问来源于stack exchange,提问作者fairlife4life
相关产品推荐
相关产品推荐

