使用Pandas Timestamp计算企业运营月数时遇int64溢出错误的解决
解决计算企业运营月数时的OverflowError问题
问题场景
你的DataFrame如下:
| company_name | founded_on |
|---|---|
| a | 2004-01-01 00:00:00 |
| b | 2013-01-01 00:00:00 |
| c | 2008-01-01 00:00:00 |
| d | 1997-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
相关产品推荐
相关产品推荐

