You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为pandas.to_datetime()设置默认日期以替换无效日期值?

解决Pandas中日期转换后NaT替换为默认日期的问题

首先直接回答你的核心问题:pd.to_datetime()本身没有参数可以直接设置默认日期来避免生成NaT,它的errors参数仅支持raise(抛出异常)、coerce(转换无效值为NaT)、ignore(保留原始值)三种选项。不过我们可以在转换后通过简单的操作把NaT替换成你想要的默认日期,而且比你之前尝试的方法更简洁准确。

最简单的解决方案:使用fillna()

在你用errors='coerce'生成NaT之后,直接调用fillna()方法就能批量替换所有NaT为指定的默认日期,代码如下:

import pandas as pd
import datetime as dt

# 你的示例数据
df = pd.DataFrame({'dates': ['2018-02-12', '2018-03-19', '12-24-2018', 'garbage']})

# 第一步:转换日期,无效值转为NaT
df['dates'] = pd.to_datetime(df['dates'], errors='coerce')

# 第二步:替换所有NaT为默认日期
default_date = dt.datetime(2018, 12, 31)
df['dates'] = df['dates'].fillna(default_date)

print(df)

执行后就能得到你期望的输出:

dates
0  2018-02-12
1  2018-03-19
2  2018-12-24
3  2018-12-31

为什么你之前的apply方法失败了?

你之前的代码:

df['dates'].apply(lambda x: dt.datetime(2018,12,31) if x is not dt.datetime else x)

问题出在判断条件x is not dt.datetime上——这里你是在判断x是否不是dt.datetime这个类本身,而不是判断x是否是无效的日期值。实际上,有效的日期值是dt.datetime的实例,而NaT是pandas._libs.tslibs.nattype.NaTType的实例,所以这个条件对所有元素都成立,导致所有值都被替换成了默认日期。

如果你一定要用apply的方式,正确的判断应该是检查值是否为NaT,比如用pd.isna(x):

df['dates'] = df['dates'].apply(lambda x: default_date if pd.isna(x) else x)

不过显然fillna()的方法更简洁高效,尤其是处理大数据集的时候。

内容的提问来源于stack exchange,提问作者user4110225

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:48:35