【问题标题】:Getting around "OverflowError: Overflow in int64 addition"解决“OverflowError:int64 加法中的溢出”
【发布时间】:2021-07-10 07:20:37
【问题描述】:

我在 Pandas 中工作,试图减去两列日期以获得它们之间的时间长度(最好以月为单位,但任何更小的单位都可以)。我的原始数据框有超过 90,000 行,因此我正在使用大约 2,000 行的数据框的修剪版本。这是个坏消息,因为我在 SMALLER 数据帧上遇到了过大的问题(我认为???)。

这是我的数据头:

     Variety        CropYear      DatePurchased         birthDate
0  AU Vic Secret™      2014  2016-03-01 23:51:27.822    2016-03-01
1  AU Vic Secret™      2014  2016-03-02 22:22:33.285    2016-03-01
2  AU Vic Secret™      2014  2016-03-04 17:03:33.247    2016-03-01
3  AU Vic Secret™      2014  2016-03-04 20:09:35.840    2016-03-01
4  AU Vic Secret™      2014  2016-03-07 14:09:36.502    2016-03-01

这是我得到的错误:

OverflowError:int64 加法中的溢出

data["birthDate"] = pd.to_datetime(data["birthDate"])

data["DatePurchased"] = pd.to_datetime(data["DatePurchased"])

data["Age"] = data["DatePurchased"] - data["birthDate"]

然后我尝试将.dt.date 添加到前两行,因为我在该站点的另一篇文章中看到了它,并盲目地希望它会起作用。它产生了这个错误

OverflowError: Python int 太大而无法转换为 C long

data["birthDate"] = pd.to_datetime(data["birthDate"]).dt.date

data["DatePurchased"] = pd.to_datetime(data["DatePurchased"]).dt.date

data["Age"] = data["DatePurchased"] - data["birthDate"]

这些错误是什么意思?我该如何解决这些问题,尤其是对于 90-10 万行的数据框?

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    计算天数,而不是像当前那样减去 2 个日期时间列时得到的较长格式“0 天 ...”:

    df = pd.DataFrame({'DatePurchased':['2016-03-01 23:51:27.822', '2016-03-02 22:22:33.285', '2020-05-20 03:52:12.739'], 'birthDate': ['2016-03-01', '2016-03-01', '2019-08-01']})
    
    df['DatePurchased'] = pd.to_datetime(df['DatePurchased'], infer_datetime_format=True)
    df['birthDate'] = pd.to_datetime(df['birthDate'], infer_datetime_format=True)
    
    df['Age'] = df['DatePurchased'] - df['birthDate']
    df['Age_days'] = (df['DatePurchased'] - df['birthDate']).dt.days
    
    

    注意年龄格式的区别:

                DatePurchased  birthDate                      Age  Age_days
    0 2016-03-01 23:51:27.822 2016-03-01   0 days 23:51:27.822000         0
    1 2016-03-02 22:22:33.285 2016-03-01   1 days 22:22:33.285000         1
    2 2020-05-20 03:52:12.739 2019-08-01 293 days 03:52:12.739000       293
    

    【讨论】:

    • 这几乎可以工作,但由于某种原因,代码为 Age_months 产生了一堆负值。什么地方出了错?某些 DatePurchased 值可能早于其相应的birthDate 值,因此会创建一个负值,但在您的代码中它应该是正值时发生(即当 DatePurchased 晚于birthDate 时。
    • 如果有帮助,我可以将我正在使用的 csv 发送给您
    • 如果您指定 2 或 3 个给您负值的日期示例,这可能足以弄清楚。
    • 示例:对于 DatePurchased = 2020-05-20 03:52:12.739 和birthDate = 2019-08-01 Age_month = -3 应该是 9
    • 现在我明白了。我将编辑答案,我减去了 2 个月,例如 3 月 - 8 月的 3 - 8 个月,而不考虑年份。我看不到从时间增量中获取几个月的方法,但是可以使用几天。
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2018-10-15
    • 2021-06-05
    • 2017-02-09
    相关资源
    最近更新 更多