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

基于Pandas生成考虑工作日与节假日的月度债务还款日程表

债务还款月度工作日序列生成方案

核心实现思路

  • 以初始日期的日值为固定基准,逐月生成目标候选日期,从根源避免日期漂移
  • 优先保留「工作日+非指定节假日」的候选日期;若不符合要求,在候选日的±3天范围内(不跨月)寻找最近的合规日期,保证日期间隔尽可能接近30天
  • 自动处理月末特殊场景(如初始日为31号,小月无对应日期时,取当月最后一天再调整)

Python代码实现

import datetime
import calendar

def generate_repayment_dates(start_date, months, holidays):
    # 转换输入日期为datetime.date对象
    if isinstance(start_date, str):
        start_date = datetime.datetime.strptime(start_date, "%Y年%m月%d日").date()
    target_day = start_date.day
    repayment_dates = []
    
    for i in range(months):
        # 计算当前偏移后的年月
        year = start_date.year + (start_date.month + i - 1) // 12
        month = (start_date.month + i - 1) % 12 + 1
        
        # 获取当月最后一天,处理目标日超过月末的情况
        last_day = calendar.monthrange(year, month)[1]
        candidate_day = min(target_day, last_day)
        candidate_date = datetime.date(year, month, candidate_day)
        
        valid_date = None
        # 先检查候选日本身是否合规
        if candidate_date.weekday() < 5 and candidate_date not in holidays:
            valid_date = candidate_date
        else:
            # 按优先级查找±3天内的合规日期,优先接近候选日的日期
            offsets = [1, -1, 2, -2, 3, -3]
            for offset in offsets:
                check_day = candidate_day + offset
                if 1 <= check_day <= last_day:
                    check_date = datetime.date(year, month, check_day)
                    if check_date.weekday() < 5 and check_date not in holidays:
                        valid_date = check_date
                        break
            # 极端场景:±3天内无合规日期,取当月第一个合规工作日兜底
            if not valid_date:
                for day in range(1, last_day + 1):
                    check_date = datetime.date(year, month, day)
                    if check_date.weekday() < 5 and check_date not in holidays:
                        valid_date = check_date
                        break
        
        if valid_date:
            repayment_dates.append(valid_date.strftime("%Y年%m月%d日"))
    
    return repayment_dates

# 示例调用
if __name__ == "__main__":
    # 初始还款日期
    start_date = "2022年4月11日"
    # 生成48个月的序列
    total_months = 48
    # 自定义节假日集合(可根据实际需求扩展)
    custom_holidays = {
        datetime.date(2022, 10, 1),
        datetime.date(2022, 10, 2),
        datetime.date(2022, 10, 3),
        datetime.date(2023, 1, 1),
        datetime.date(2023, 2, 21)
    }
    
    result_dates = generate_repayment_dates(start_date, total_months, custom_holidays)
    print("生成的还款日期序列:")
    for dt in result_dates:
        print(dt)

关键细节说明

  • 基准日锚定:始终以初始日期的日值为参考,每个月先尝试生成对应日期,确保序列的月度间隔稳定,避免偏移量累积导致的日期漂移
  • 合规性校验:通过weekday() < 5判断工作日(周一至周五为0-4),自定义节假日集合支持灵活扩展特殊日期
  • 优先级查找:按「±1天→±2天→±3天」的顺序查找,保证最终日期尽可能接近基准日,满足利息计算的间隔要求
  • 边界兜底:极端场景下(如当月±3天全为节假日/休息日),自动取当月第一个合规工作日,避免序列断裂

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:35:27