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

如何避免pd.to_datetime将非日期字符串误转为日期?

如何避免pandas将非日期字符串错误转换为日期

当使用pd.to_datetime(df['_date_'], errors='coerce')转换日期时,像"--70--"这类非日期字符串会被错误解析为2070-01-01,"--99--"被解析为1999-01-01。这是因为pandas默认会尝试从字符串中提取数字部分构造日期,哪怕字符串包含非日期格式的符号。

以下是两种可行的解决方法:

方案1:指定明确的日期格式

如果你的合法日期只有固定格式(比如示例中的"22 Jun 2023",对应格式%d %b %Y),直接在pd.to_datetime中指定format参数,只有完全匹配该格式的字符串才会被转换,其他都会转为NaT:

import pandas as pd

df = pd.DataFrame(
    {'_date_': ['22 Jun 2023', '123', '--99--', "--70--", "b", "c", "d"]})

# 指定日期格式
df["_date_"] = pd.to_datetime(df['_date_'], format='%d %b %Y', errors='coerce')
print(df['_date_'])

输出结果:

0   2023-06-22
1          NaT
2          NaT
3          NaT
4          NaT
5          NaT
6          NaT
Name: _date_, dtype: datetime64[ns]

方案2:用正则表达式预先筛选合法日期

如果存在多种合法日期格式,可以先用正则匹配出符合日期模式的字符串,再进行转换:

import pandas as pd
import re

df = pd.DataFrame(
    {'_date_': ['22 Jun 2023', '123', '--99--', "--70--", "b", "c", "d"]})

# 定义匹配合法日期的正则(这里匹配"日 月缩写 年"的格式)
date_regex = r'^\d{1,2} [A-Za-z]{3} \d{4}$'
# 生成匹配掩码
valid_dates = df['_date_'].str.match(date_regex)

# 仅对匹配的字符串转换日期,不匹配的设为NaT
df['_date_'] = pd.to_datetime(df.loc[valid_dates, '_date_'], errors='coerce')
df.loc[~valid_dates, '_date_'] = pd.NaT

print(df['_date_'])

输出结果与方案1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:48:20