在 Python Pandas 中基于波兰 PESEL 计算年龄时出错?

Error during calculation of age based on Polish PESEL in Python Pandas?

我在 Python Pandas 中有数据框,如下所示,str 值:

NR
--------
910517196
921122192
020612567

我尝试使用以下代码根据“NR”列中的值计算年龄:

ABT_DATE = pd.Timestamp(year=2021, month=6, day=30)
df['age'] = (ABT_DATE - pd.to_datetime(df.NR.str[:6], format = '%y%m%d')) / np.timedelta64(1, 'Y')
df["age"] = df.age.astype("int")

上面代码的逻辑是:从“NR”列的df中取前6个数字并据此计算年龄,因为例如:910517196(前6个数字)是1991-05-17。

然而,当我尝试使用我的代码时出现如下错误:

ValueError: unconverted data remains: 20

我的 DataFrame 有超过 40 万行,因此很难检查所有行,但我确定我没有 NaN,而且年月日的间隔是正确的。

正如您在下面的示例中看到的那样,此代码是正确的并且应该可以工作,为什么它适用于小示例代码而不适用于我超过 400k 行的数据帧?

df = pd.DataFrame({"NR" : ["95050611475", "00112575862"]})
df['age'] = (ABT_DATE - pd.to_datetime(df.NR.str[:6], format = '%y%m%d')) / np.timedelta64(1, 'Y')
df["age"] = df.age.astype("int")
df

如何修复我的大数据框以便能够在 Python Pandas 中使用我的代码?

您可能有一些格式错误的行。要找到它们,我建议您使用 to_datetimeerrors='coerce' 作为参数。所有未转换的值都设置为 NaN。因此,您可以使用布尔掩码 m 来查找错误值。

df = pd.DataFrame({"NR" : ["95050611475", "00112575862", "badformat"]})

m = pd.to_datetime(df.NR.str[:6], format='%y%m%d', errors='coerce').isna()
print(df[m])

# Output:
          NR
2  badformat