使用Pandas计算日期与今日的月份差报错,求解决方案及优化方法
问题原因
报错TypeError: unsupported operand type(s) for -: 'Timestamp' and 'datetime.date'的核心是类型不兼容:你的数据集date列是Pandas的Timestamp类型,而date.today()返回的是Python标准库的datetime.date类型,这两种日期对象无法直接做减法运算。
基础修复方案
把today转换成Pandas的Timestamp类型,就能解决类型匹配问题:
import pandas as pd import numpy as np from datetime import date def calc_date_countdown(df): # 将datetime.date转为Timestamp,保持与数据集日期类型一致 today = pd.Timestamp(date.today()) # 或者直接用Pandas原生方法获取今日日期(自动是Timestamp类型) # today = pd.Timestamp.today().normalize() # normalize移除时分秒,和date.today()效果一致 df['countdown'] = (df['date'] - today) / np.timedelta64(1, 'M') df['countdown'] = df['countdown'].astype(int) return df
更高效的实现方式
避免使用apply——它是逐行遍历处理,在大数据集下效率极低。推荐用Pandas的矢量化运算,直接对整列计算,同时还能解决时间差除法的精度问题(np.timedelta64(1, 'M')按平均30.4375天计算,会有误差):
import pandas as pd def calc_date_countdown(df): # 确保日期列是datetime类型(如果还不是的话) df['date'] = pd.to_datetime(df['date']) today = pd.Timestamp.today().normalize() # 直接计算年份差*12 + 月份差,得到精准的整数月份差值 df['countdown'] = ((df['date'].dt.year - today.year) * 12 + (df['date'].dt.month - today.month)).astype(int) return df
这个方法计算的是精准的月份数差,比如2024-06和2024-03的差值是3,比时间差除法的结果更准确,同时运算速度提升数倍。
内容的提问来源于stack exchange,提问作者Mike Mann
相关产品推荐
相关产品推荐

