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

如何处理DataFrame日期列的非法数值并完成datetime转换?

问题

DataFrame里有一列叫Competencia,数据类型是object,本应只存YYYY-MM-DD格式的日期,但现在混进了0、11这类非法数值,甚至还有字符串COMPETENCIA——这直接导致转换日期时抛出ParserError: Unknown string format: COMPETENCIA错误。原本想创建新列dt_COMP把日期转成datetime格式,用的代码如下:

#Converting 'COMPETENCIA' into date -> new Column: 'dt_COMP'

df30_new['dt_COMP'] = pd.to_datetime(df30_new['Competencia'], yearfirst=True)

df30_new['dt_COMP'] = pd.to_datetime(df30_new['dt_COMP']).dt.date
df30_new["dt_COMP"] = pd.to_datetime(df30_new["COMPETENCIA"], format="%Y/%m/%d")

需要解决非法值清理和日期格式转换的问题。

解决方案

1. 先清理非法值

先把Competencia列里的无效值(0、11、字符串COMPETENCIA)换成NaN,方便后续处理:

# 替换指定无效值为NaN
df30_new['Competencia'] = df30_new['Competencia'].replace(['COMPETENCIA', 0, 11], pd.NA)

如果想更通用,只保留符合YYYY-MM-DD格式的值,其他一律设为NaN,可以用正则匹配:

import re
# 定义YYYY-MM-DD的正则规则
date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}$')
# 过滤不符合格式的内容
df30_new['Competencia'] = df30_new['Competencia'].apply(lambda x: x if date_pattern.match(str(x)) else pd.NA)

2. 正确转换日期格式

原代码有两个明显问题:一是重复调用pd.to_datetime还来回转格式,完全没必要;二是指定的格式%Y/%m/%d和实际的YYYY-MM-DD不匹配,应该用%Y-%m-%d。

正确的转换代码:

# 转换为datetime格式,errors='coerce'会把无法解析的值自动转为NaT(日期类型的缺失值)
df30_new['dt_COMP'] = pd.to_datetime(df30_new['Competencia'], format='%Y-%m-%d', errors='coerce')

这里的errors='coerce'参数很实用,就算没提前手动清理无效值,也能避免报错,直接把垃圾值转成可识别的缺失类型。

3. 可选:处理缺失值

转换后如果有NaT(缺失日期),可以根据需求处理:

# 删除含缺失日期的行
df30_new = df30_new.dropna(subset=['dt_COMP'])

# 或者用指定日期填充缺失值
df30_new['dt_COMP'] = df30_new['dt_COMP'].fillna(pd.to_datetime('1900-01-01'))

内容的提问来源于stack exchange,提问作者Gabriel Angelo Branco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:40:59