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
相关产品推荐
相关产品推荐

