首页 > 解决方案 > 如何修复 OverflowError:int64 加法中的溢出

问题描述

我试图从列中减去列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
.
.
.

标签: pythonpandasdatetimedata-sciencetimedelta

解决方案


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)

推荐阅读