如何修复 OverflowError:int64 加法中溢出

问题描述 投票:0回答:7

我试图从

df['date_of_admission']
列中减去
df['DOB']
列以找到两者之间的差异并将年龄值存储在
df['age']
列中,但是,我收到此错误:

OverflowError:int64 加法溢出

 DOB          date_of_admission      age
 2000-05-07   2019-01-19 12:26:00        
 1965-01-30   2019-03-21 02:23:12        
 NaT          2018-11-02 18:30:10        
 1981-05-01   2019-05-08 12:26:00       
 1957-01-10   2018-12-31 04:01:15         
 1968-07-14   2019-01-28 15:05:09            
 NaT          2018-04-13 06:20:01 
 NaT          2019-02-15 01:01:57 
 2001-02-10   2019-03-21 08:22:00       
 1990-03-29   2018-11-29 03:05:03
.....         ......
.....         .....
.....         .....

我已经尝试过以下方法:

import numpy as np
import pandas as pd
from datetime import dt

df['age'] = (df['date_of_admission'] - df['DOB']).dt.days // 365

找到两者之间的差异后预计会得到以下年龄列:

age
26
69
NaN
58
.
.
.
python pandas datetime data-science timedelta
7个回答
9
投票

OP 最有可能使用医学 MIMIC 数据集,其中日期已被打乱以保护患者的身份。具体来说,对于 89 岁以上的患者,他们将出生日期移了 300 年

使用 pandas timedelta 时,这样的长时间跨度会导致溢出:

pd.to_timedelta(300, unit="Y", box=False)
> numpy.timedelta64(-8979658473709551616,'ns')

当数据帧操作中发生这种情况时,您将遇到错误。改编自@tawab_shakeel的答案:

df = pd.DataFrame(data={"DOB":['2000-05-07','1965-01-30','1700-01-01'],
                   "date_of_admission":["2019-01-19 12:26:00","2019-03-21 02:23:12", "2000-01-01 02:23:23"]})

df['DOB'] = pd.to_datetime(df['DOB']).dt.date
df['date_of_admission'] = pd.to_datetime(df['date_of_admission']).dt.date

# Gives AttributeError: Can only use .dt accessor with datetimelike values
df['age'] = ((df['date_of_admission']-df['DOB']).dt.days) //365

# Gives OverflowError: long too big to convert
pd.to_timedelta(df['date_of_admission']-df['DOB'])

任何转换为

timedelta64[ns]
数据类型的计算都会出现此问题。

作为解决方法,您可以使用

apply
操作,直接计算每个元素的年龄元素:

df['age'] = df.apply(lambda e: (e['date_of_admission'] - e['DOB']).days/365, axis=1)

3
投票

将两列转换为日期,然后减去它

import pandas as pd


df['date_of_admission'] = pd.to_datetime(df['date_of_admission']).dt.date

df['DOB'] = pd.to_datetime(df['DOB']).dt.date

df['age'] = ((df['date_of_admission']-df['DOB']).dt.days) //365

第二次测试

#Now I have use DOB AND date_of_admission data from the question and it is working fine

df = pd.DataFrame(data={"DOB":['2000-05-07','1965-01-30','NaT'],
                   "date_of_admission":["2019-01-19 12:26:00","2019-03-21 02:23:12", "2018-11-02 18:30:10"]})

df['DOB'] = pd.to_datetime(df['DOB']).dt.date
df['date_of_admission'] = pd.to_datetime(df['date_of_admission']).dt.date
df['age'] = ((df['date_of_admission']-df['DOB']).dt.days) //365

结果:

DOB       date_of_admission   age
2000-05-07  2019-01-19       18.0
1965-01-30  2019-03-21       54.0
NaT         2018-11-02       NaN

1
投票

1)。您做得正确,但

DOB
包含唯一的日期并且
date_of_admission
包含日期和时间。操作
date_of_admission
使其仅包含日期,然后您将得到结果。

2)。在这里,我在您的代码中添加了

change function
,以便您得到结果。

import numpy as np
import pandas as pd
from datetime import dt

def change(x):
    return x.date()

df['date_of_admission'] = df['date_of_admission'].apply(change)

df['age'] = df['date_of_admission'].subtract(df['DOB']).dt.days // 365

希望对你有帮助。


0
投票

我正在使用 MIMIC III 数据集,也遇到了这个问题。我发现@Rahul_chacharan 的评论使用

df['date_of_admission'].subtract(df['DOB']).dt.days // 365
为我工作!


0
投票

我想大家在处理MIMIC3数据库时都会遇到这个问题,这是我的解决方案,非常直观,但速度更快,你可以尝试一下。

df_labevents_temp['age']  = ((df['date_of_admission'].values  - df['DOB'].values).astype(np.int)/8.64e13//365).astype(np.int)

想法是将其转换为 numpy int,然后从 ns 转换为year。 pandas date diff 函数对我不起作用,使用 apply 太慢(我认为只是循环)。


0
投票

对于那些从 @tawab_shakeel 的答案中遇到错误

AttributeError: Can only use .dt accessor with datetimelike values
的人,请尝试以下代码

import pandas as pd

df['date_of_admission'] = pd.to_datetime(df['date_of_admission']).dt.date

df['DOB'] = pd.to_datetime(df['DOB']).dt.date

df['age'] = ((df['date_of_admission']-df['DOB']) //365).dt.days

它将返回年龄的int值


0
投票

根据here的答案,尝试以下代码:

df['AGE'] = df.apply(lambda s: (s['INTIME'].to_pydatetime()-s['DOB'].to_pydatetime()).days / 365.0, axis=1)`

我还应该提到我使用了pandas==1.5

© www.soinside.com 2019 - 2024. All rights reserved.