You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas Timestamp计算企业运营月数时遇int64溢出错误的解决

解决计算企业运营月数时的OverflowError问题

问题场景

你的DataFrame如下:

company_namefounded_on
a2004-01-01 00:00:00
b2013-01-01 00:00:00
c2008-01-01 00:00:00
d1997-01-01 00:00:00

执行以下代码时触发OverflowError: Overflow in int64 addition:

today = pd.Timestamp.now()
df["founded_on"]=pd.to_datetime(df["founded_on"])
df["Time_Since_founded_on"] = (today - df["founded_on"]).dt.days // 30

解决方案

方法一:用Period计算自然月份差(推荐)

直接基于月份周期计算差值,既避免溢出,又保证计算的是真实自然月数(比按30天估算更准确):

import pandas as pd

# 初始化DataFrame(已有可跳过)
data = {
    "company_name": ["a", "b", "c", "d"],
    "founded_on": ["2004-01-01 00:00:00", "2013-01-01 00:00:00", "2008-01-01 00:00:00", "1997-01-01 00:00:00"]
}
df = pd.DataFrame(data)

df["founded_on"] = pd.to_datetime(df["founded_on"])
today = pd.Timestamp.now().floor('D')  # 取当日日期,忽略时分秒

# 转换为月份周期后计算差值
df["Time_Since_founded_on"] = (today.to_period('M') - df["founded_on"].dt.to_period('M')).apply(lambda x: x.n)

方法二:用relativedelta计算精确月份差

借助dateutil库的relativedelta直接计算年、月差值,转换为总月数:

import pandas as pd
from dateutil.relativedelta import relativedelta

# 初始化DataFrame(已有可跳过)
data = {
    "company_name": ["a", "b", "c", "d"],
    "founded_on": ["2004-01-01 00:00:00", "2013-01-01 00:00:00", "2008-01-01 00:00:00", "1997-01-01 00:00:00"]
}
df = pd.DataFrame(data)

df["founded_on"] = pd.to_datetime(df["founded_on"])
today = pd.Timestamp.now().floor('D')

df["Time_Since_founded_on"] = df["founded_on"].apply(
    lambda x: relativedelta(today, x).years * 12 + relativedelta(today, x).months
)

错误原因说明

原代码通过(today - df["founded_on"]).dt.days计算天数差再估算月数,当时间差对应的天数超出int64类型存储范围(或pandas内部处理触发溢出)时,就会抛出OverflowError。上述两种方法直接基于月份维度计算,不涉及大整数天数运算,从根源避免了溢出问题,同时结果更符合真实运营月数的定义。

内容的提问来源于stack exchange,提问作者Rebeka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:47:25