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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:09:02