PAYATHON 2026

pandas 如何定位并修正超出范围的日期值?

数据阿明

结论

可以用 pd.to_datetime(..., errors="coerce") 将无法转换的值暂时设为 NaT,再通过布尔条件找出对应行。题目中的 2821-11-10 超出常见 datetime64[ns] 时间戳的表示范围。如果确认它实际应为 2021-11-10,先修正这个值,再转换整列。

定位异常值

假设原始列名为 date:

raw = df["date"]
parsed = pd.to_datetime(raw, errors="coerce")

# 排除原本就为空的值,只保留转换失败的行
bad_mask = raw.notna() & parsed.isna()

# 查看异常值及其 DataFrame 索引
print(df.loc[bad_mask, ["date"]])

errors="coerce" 会将转换失败或超出范围的值设为 NaT。raw.notna() 会排除原本为空的单元格,因此 bad_mask 标记的是原来有值、转换后却变成 NaT 的行。

异常信息中的 position 1818 通常表示该值在传入数据中的位置。要按行顺序查看附近内容,可以检查:

print(df.iloc[1818])

如果 DataFrame 使用自定义索引,iloc 按行位置访问,loc 则按索引标签访问。

修正并转换

确认异常值应为 2021-11-10 后,可以根据标记修正:

df.loc[bad_mask, "date"] = "2021-11-10"
df["date"] = pd.to_datetime(df["date"])

如果列中还可能有其他无效值,可以再次检查转换结果:

parsed = pd.to_datetime(df["date"], errors="coerce")
remaining_bad = df["date"].notna() & parsed.isna()

print(df.loc[remaining_bad, ["date"]])

确认所有异常值都处理完后,再将转换结果赋回列中:

df["date"] = parsed

注意事项

转换失败也可能是日期格式错误,不一定是年份超出范围。修正前应查看原始值并确认预期日期。如果数据包含时区或多种日期格式,也应根据实际格式检查转换结果。

备注:内容仅供参考。