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

Python中使用pandas计算指定日期与开户日间隔年份(MOB)的实现方法

Python Pandas计算两个日期的间隔满年数(开户年限MOB)

前置修正:日期格式转换错误修复

你当前的日期转换代码中format参数与实际日期字符串格式不匹配,原始数据中的日期为YYYY-MM-DD格式,需要调整参数:

import pandas as pd
df = pd.DataFrame(
     { "MIS_DATE": ["2018-03-02", "2020-03-26", "2019-08-17", "2019-08-17", "2019-08-19"],
       "CRDACCT_DTE_OPEN": ["2021-03-31", "2021-03-31", "2021-03-31", "2021-03-31",  "2021-03-31"]})

# 修正日期转换逻辑
df['CRDACCT_DTE_OPEN'] = pd.to_datetime(df['CRDACCT_DTE_OPEN'], format='%Y-%m-%d')
df['MIS_DATE'] = pd.to_datetime(df['MIS_DATE'], format='%Y-%m-%d')

准确计算满年开户年限MOB

要计算满N年的年限,需要先取年份差,再判断月日是否过了当年的开户纪念日,没到则减1,避免闰年或月日不匹配的误差:

# 计算初始年份差
year_gap = df['MIS_DATE'].dt.year - df['CRDACCT_DTE_OPEN'].dt.year
# 判断是否过了当年开户纪念日
passed_anniv = (df['MIS_DATE'].dt.month > df['CRDACCT_DTE_OPEN'].dt.month) | \
              ((df['MIS_DATE'].dt.month == df['CRDACCT_DTE_OPEN'].dt.month) & 
               (df['MIS_DATE'].dt.day >= df['CRDACCT_DTE_OPEN'].dt.day))
# 计算最终MOB,不满整年的减1,clip(lower=0)用于限制最小年限为0,避免日期倒序出现负数
df['MOB'] = (year_gap - (~passed_anniv).astype(int)).clip(lower=0)

简化版计算(适合精度要求不高的场景)

如果不需要严格卡月日,可直接按总天数除以365向下取整:

df['MOB'] = ((df['MIS_DATE'] - df['CRDACCT_DTE_OPEN']).dt.days // 365).clip(lower=0)

效果验证

以你举的例子为例:开户日期为2018-03-31,指定日期为2021-03-01时,月日未到纪念日,MOB为2;指定日期为2021-03-31时,MOB为3,符合需求。
你提供的测试数据中所有MIS_DATE都早于开户日期,所以计算得到的MOB均为0,可替换为实际业务数据验证效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:15:03