解析失败时先检查脏数据,用errors="coerce"定位nat;outofboundsdatetime因纳秒范围限制,多格式混杂需归一化再解析;时区不一致或nat会导致静默错误,须提前清理并统一基准。

pd.to_datetime() 解析失败时先看错误类型
遇到 ParserError 或 OutOfBoundsDatetime 不要急着改格式字符串,先确认输入里有没有脏数据——比如空字符串、"NULL"、带中文的“2023年5月1日”、或明显越界的日期如 "9999-99-99"。pandas 默认对异常值直接报错,不是忽略。
- 用
errors="coerce"把解析失败的转成NaT,快速定位问题行:pd.to_datetime(df["date_col"], errors="coerce") - 如果报
OutOfBoundsDatetime,说明 pandas 用的是纳秒级时间戳(范围约 ±2262 年),而你的日期超出了这个范围;此时要么过滤掉,要么用errors="ignore"保留原始字符串(但后续无法做时间运算) - 中文/混合字符必须显式指定
format或用infer_datetime_format=False,否则infer_datetime_format=True会跳过非标准格式直接失败
format 参数不是万能的,但不写往往更慢
当列中所有日期格式统一(如全是 "2023-05-01 14:30:00"),硬写 format="%Y-%m-%d %H:%M:%S" 比让 pandas 自推快 3–5 倍;但如果格式混杂(比如同时有 "2023/05/01" 和 "01-May-2023"),写死 format 会导致大量 NaT。
- 优先尝试
pd.to_datetime(series, infer_datetime_format=True)—— 它只在首 100 行采样推断,速度快且覆盖常见 ISO 格式 - 若推断失败,再用
unique()看下实际有哪些格式:df["date_col"].dropna().unique()[:10] - 多格式混杂时,别硬扛:先用
.str.replace()归一化(比如把斜杠全换横杠),再统一解析
时区处理不当会让结果差 8 小时
没有显式时区信息的字符串(如 "2023-05-01")被解析后是 tz-naive,和带时区的 tz-aware 时间计算时会报 TypeError;更隐蔽的问题是,用 .dt.tz_localize("Asia/Shanghai") 后没立刻 .dt.tz_convert("UTC"),就直接和其他 UTC 时间比大小,结果可能偏移一整天。
- 读取时就定好时区:
pd.to_datetime(series).dt.tz_localize("Asia/Shanghai") - 跨时区比较前务必统一基准:
ts_utc = ts_sh.tz_convert("UTC") - 存 CSV 前记得去掉时区(否则再读会变字符串):
df["time"].dt.tz_localize(None)
resample 和 dt accessor 的坑:NaT 会静默消失
df.set_index("time").resample("D").sum() 这类操作遇到 NaT 索引时不会报错,而是直接丢掉整行——看着结果少了几天,却找不到原因。同理,df["time"].dt.month 对 NaT 返回 NaN,但如果你后续用它做分组,NaN 组会被忽略。
- 检查索引是否含
NaT:df.index.isna().sum() - resample 前先清理:
df = df.dropna(subset=["time"]).set_index("time") - 用
.dt属性前确认无NaT,或用.dt.month.fillna(0)显式处理缺失
最麻烦的不是语法错,而是时间列里混了 NaT 或时区状态不一致,这种问题跑完模型才发现,得倒回去一行行查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











