【问题标题】:Error during calculation of age based on Polish PESEL in Python Pandas?在 Python Pandas 中基于波兰 PESEL 计算年龄时出错?
【发布时间】:2021-12-05 00:56:29
【问题描述】:

我在 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 有超过 400k 行,因此很难检查所有行,但我确信我没有 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 中使用我的代码?

【问题讨论】:

    标签: python pandas datetime valueerror timedelta


    【解决方案1】:

    您可能有一些格式错误的行。要找到它们,我建议您使用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
    

    【讨论】:

    • 完美,谢谢! :)
    猜你喜欢
    • 2021-08-25
    • 2017-08-08
    • 2012-03-26
    • 2018-03-12
    • 1970-01-01
    • 2014-11-16
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多