用pandas.to_datetime()配errors='coerce'是最稳的批量日期清洗起点,但需配合fillna()和显式格式推断才能落地;默认errors='raise'是安全策略而非bug,非法值转NaT后应先评估脏数据比例再谨慎补全,避免污染统计。

直接说结论:用 pandas.to_datetime() 配合 errors='coerce' 是最稳的批量日期清洗起点,但必须配合 fillna() 和显式格式推断才能真正落地。
为什么 to_datetime() 默认会报错而不是跳过脏数据
默认 errors='raise',遇到 '2023-13-45'、'??/02/2022' 或空字符串就直接抛 ValueError,根本跑不完。这不是 bug,是 pandas 的安全策略——它拒绝猜测你到底想怎么处理异常值。
实操建议:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 始终显式传
errors='coerce',让非法值变成NaT(Not a Time) - 别依赖自动格式推断,尤其当列里混着
'2023-01-01'、'01/01/2023'、'Jan 1, 2023'时,infer_datetime_format=True可能误判并静默出错 - 如果已知主要格式(比如全是
YYYY-MM-DD),优先用format='%Y-%m-%d',速度提升 3–5 倍且结果确定
清洗后怎么补全 NaT 而不引入错误时间
NaT 是信号,不是垃圾。盲目用 fillna(pd.Timestamp('1970-01-01')) 会污染后续统计(比如算平均日期、分组计数时把占位符当真实数据)。
实操建议:
- 先用
df['date_col'].isna().sum()看脏数据比例,>5% 就得人工抽样检查原因 - 补全只在业务明确允许时才做,例如:“缺失日期统一按当月第一天”,则用
fillna(pd.to_datetime('2023-01-01').replace(day=1)) - 更安全的做法是保留
NaT,并在下游加标记列:df['date_is_clean'] = df['date_col'].notna()
如何处理带时区或非标准分隔符的混合输入
现实数据常含 '2023-01-01T12:34:56+08:00'、'01.01.2023 12:34'、'2023/01/01 12:34:56.123' —— 单一 format 参数搞不定。
实操建议:
- 先用正则粗筛标准化:比如
df['date_col'].str.replace(r'(\d{4})\.(\d{2})\.(\d{2})', r'\1-\2-\3', regex=True)统一分隔符 - 对含时区的字符串,加
utc=True参数强制转为 UTC 时间戳,避免本地时区干扰 - 若需保留原始时区信息,改用
dateutil.parser.parse()单条处理(慢但准),再向量化:df['date_col'].apply(lambda x: dateutil.parser.parse(x) if pd.notna(x) else pd.NaT)
真正难的不是转换函数本身,而是确认「这个字段在业务里到底代表什么时间」——是创建时间?生效时间?还是用户随便填的字符串?没理清这点,再规范的格式也只是假干净。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










