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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:50:45