如何处理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
相关产品推荐
相关产品推荐

