Python Pandas基于波兰PESEL计算年龄出现ValueError如何解决?
问题原因
你遇到的ValueError: unconverted data remains: 20报错,核心是pd.to_datetime在严格解析模式下,待解析的字符串和你指定的%y%m%d格式(要求刚好6位数字)不匹配,存在多余/不足的字符。
小样本运行正常但全量报错,说明全量数据中存在不符合预期的NR值,常见情况包括:
- 部分NR值携带隐形空格、特殊符号
- 部分NR长度不足6位,
str[:6]切片后短于6位 - 部分NR不是字符串类型,切片操作失效
修复方案
第一步:快速定位异常数据
不需要逐行遍历40万行,先通过容错参数定位异常值:
# 解析时加errors='coerce',无法解析的内容会转为空时间NaT test_birth = pd.to_datetime(df.NR.str.strip().str[:6], format='%y%m%d', errors='coerce') # 打印前20条无法解析的NR值,确认异常规律 print(df[test_birth.isna()]['NR'].head(20))
第二步:修复运行代码
如果异常值可忽略,直接加容错参数即可正常运行:
import pandas as pd import numpy as np ABT_DATE = pd.Timestamp(year=2021, month=6, day=30) # 先去除NR的前后空格,再切片前6位,解析时加容错 df['age'] = (ABT_DATE - pd.to_datetime(df.NR.str.strip().str[:6], format='%y%m%d', errors='coerce')) / np.timedelta64(1, 'Y') # 无法计算的年龄填充为0或其他默认值,再转整数 df["age"] = df.age.fillna(0).astype("int")
可选:强校验所有NR合法性
如果要求所有行都必须正确计算年龄,先做前置格式校验:
# 校验NR前6位为纯数字,长度至少6位 df['is_nr_valid'] = df['NR'].str.strip().str.match(r'^\d{6,}') # 输出所有不合法的NR invalid_nr = df[~df['is_nr_valid']]['NR'].unique() print(f"发现{len(invalid_nr)}种不合法的NR值:{invalid_nr}")
根据输出的异常值规律针对性处理即可。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

