如何修复 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' @bilaldef 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
[踩坑] Django "OverflowError: Python int too large to convert to C long" 错误