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

Posted

技术标签:

【中文标题】如何修复 OverflowError:int64 加法中的溢出【英文标题】:How to fix OverflowError: Overflow in int64 addition 【发布时间】:2019-11-05 07:53:21 【问题描述】:

我正在尝试从 df['DOB'] 列中减去 df['date_of_admission'] 列以找出两者之间的差异并将年龄值存储在 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怎么知道是日期? 您做对了,但DOB 包含唯一的日期并且date_of_admission 包含日期和时间。操作 date_of_admission 使其仅包含日期,然后您将获得结果。 【参考方案1】:

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')

当这种情况发生在数据框操作中时,您会遇到错误。改编自@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)

【讨论】:

【参考方案2】:

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

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

【讨论】:

您好,tawab,感谢您的热心帮助。我试过了,我可以得到如下格式的年龄:0 23714天,0:00:00 1 25980天,0:00:00 2 25980天,0:00:00 3 14250天,0:00: 00 现在我尝试了 df['age'] = ((df['date_of_admission']-df['DOB']).dt.days) //365 但我得到了这个错误:AttributeError: Can only use .dt accessor with日期时间类值 @bilal 首先使用 pd.to_datetime() 将它们转换为日期格式,然后尝试减去 我尝试如下: df[date_of_admission'] = pd.to_datetime(df['date_of_admission']) df['DOB'] = pd.to_datetime(df['DOB']) df ['age'] = ((df['date_of_admission']-df['DOB']).dt.days) //365 我又回到了同样的错误:OverflowError: Overflow in int64 addition 请分享dataframe代码,我可以检查问题 这是请求的代码 import pandas as pd import numpy as np import datetime df['age'] = (df['date_of_admission'] - df['DOB']).dt.days // 365 df['age'] = np.where(df['age'] 【参考方案3】:

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

希望对你有帮助。

【讨论】:

谢谢拉胡尔。我累了,但它给了我这个错误: AttributeError: 'datetime.date' object has no attribute 'date' @bilal def change(x)date_of_admission 上使用此函数,这是一个datetime.datetime 对象。我认为您在DOB 上使用了它,这是一个datetime.date 对象,这就是您收到此错误的原因。我已经检查过了,它在我的笔记本电脑上工作。 @bilal x = datetime.datetime(2019,6,21,3,25,26) print(x) print(x.date()) 首先在您的笔记本电脑上尝试此代码,AND 然后尝试 'y=datetime.date(2019,5,26) print(y) print( y.date)`。 CODE,你会看到区别的。 感谢 Rahul,我试过了,我收到了这个错误:AttributeError: type object 'datetime.datetime' has no attribute 'datetime' 虽然我已经导入了 datetime 我正在上传图片的链接,您可以在那里看到它:-“drive.google.com/uc?id=1IZY8Kp3jRJqFibNYHGULShKaura2PGNi”。它对我有用。【参考方案4】:

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

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案5】:

我想我们在处理 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 date diff 函数对我不起作用,使用 apply 太慢(我认为只是循环)。

【讨论】:

以上是关于如何修复 OverflowError:int64 加法中的溢出的主要内容,如果未能解决你的问题,请参考以下文章

python 提示 :OverflowError: Python int too large to convert to C long

Delphi - 检测 Int64 溢出错误

[踩坑] Django "OverflowError: Python int too large to convert to C long" 错误

如何修复非法 Parquet 类型:INT64 (TIMESTAMP_MICROS) 错误

如何在没有OverflowError的情况下等待键盘输入

Web3.eth:溢出错误:Python int 太大而无法转换为 C ssize_t