pandas 如何修复溢出错误:int64加法溢出

xnifntxz  于 2023-01-07  发布在  其他
关注(0)|答案(6)|浏览(139)

我试图从df['DOB']列减去df['date_of_admission']列,以找出两者之间的差值,并将年龄值存储在df['age']列中,但是,我得到了以下错误:
溢出错误: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
.
.
.
fwzugrvs

fwzugrvs1#

OP最有可能使用医学MIMIC数据集,其中的日期被打乱以保护患者的身份,特别是对于89岁以上的患者,they shifted the date of birth by 300 years
使用pandas timedelta时,像这样的长时间跨度会给予溢出:

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

当这种情况发生在 Dataframe 操作中时,你会遇到一个错误。根据@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)
91zkwejq

91zkwejq2#

将两列都转换为日期,然后相减

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
bt1cpqcv

bt1cpqcv3#

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

希望对你有帮助。

biswetbf

biswetbf4#

我正在使用MIMIC III数据集,也遇到了这个问题。我发现@Rahul_chacharan关于使用df['date_of_admission'].subtract(df['DOB']).dt.days // 365的评论对我很有效!

l7wslrjt

l7wslrjt5#

我想我们在处理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转换成years.Pandas日期diff函数对我来说不起作用,使用apply太慢了(我认为只是循环)。

n9vozmp4

n9vozmp46#

对于从@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值作为年龄

相关问题