Python - 生成 15 日和该月最后一天的日期列表

问题描述 投票:0回答:1

我正在尝试生成从 FirstPaymentDate 开始的每月 15 号和最后一天的日期列表,以表示期限的长度。

当前代码:

import datetime
from datetime import timedelta
from dateutil.relativedelta import relativedelta
import math
import pandas as pd
import calendar

payFreq = 'SM'
SM_type = '15_EOM' #1_16 or 15_EOM
dual_dates = [28,29,30,31]
term = 16
SM_term = term // 2

x = range(term)

setupdate = datetime.datetime.strptime('2/14/2024', '%m/%d/%Y')
firstpaymentdate = datetime.datetime.strptime('3/31/2024', '%m/%d/%Y')
secondpaymentdate = datetime.datetime.strptime('4/15/2024', '%m/%d/%Y')

current_date = firstpaymentdate
dates = []

start_date = firstpaymentdate
num_dates = term
current_date = start_date
next_day = []
pmtmonth = current_date.month + 1

for x in range(SM_term):

    if SM_type == '15_EOM' and firstpaymentdate.day == 15:
        dates.append(current_date.replace(month = 4,day=15))
        last_day_of_month = (current_date.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
        dates.append(last_day_of_month)
        current_date = last_day_of_month + timedelta(days=1)
    elif SM_type == '15_EOM' and firstpaymentdate.day != 15:
        dates.append(current_date)
        if firstpaymentdate.month == 12:
            current_date = datetime.datetime(current_date.year + 1, day = 15, month = 1)        
            dates.append(current_date)
        else: 
            #dates.append(current_date.replace(month = pmtmonth, day=15))
            pmtmonth = current_date.month + 1
            next_day = current_date + timedelta(days=15)
            dates.append(next_day)
            last_day_of_month = (current_date.replace(month = pmtmonth, day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
            dates.append(last_day_of_month)
            if calendar.monthrange(current_date.year,current_date.month)[1] == 31:
                current_date = last_day_of_month + timedelta(days=15)

            else:
                current_date = last_day_of_month + timedelta(days=16)
                #current_date = last_day_of_month + timedelta(days=15)
                
for date in dates:
    print(date.strftime("%Y-%m-%d"))

当前结果 2024-03-31 2024-04-15 2024-04-30 2024-05-15 2024-05-30 2024-06-30 2024-07-15 2024-07-30 2024-08-31 2024-09-15 2024-09-30 2024-10-31 2024-11-16 2024-12-01 2024-12-31 2025-01-16 2025-01-31 2025-02-28 2025-03-15 2025-03-30 2025-04-30 2025-05-15 2025-05-30 2025-06-30

预期结果: 2024 年 3 月 31 日 2024 年 4 月 15 日 2024 年 4 月 30 日 ... 2024 年 11 月 15 日

如有任何帮助,我们将不胜感激!

python date datetime
1个回答
0
投票

试试这个:

import datetime
from datetime import timedelta
import calendar

payFreq = 'SM'
SM_type = '15_EOM'  # 1_16 or 15_EOM
term = 16
SM_term = term // 2

setupdate = datetime.datetime.strptime('2/14/2024', '%m/%d/%Y')
firstpaymentdate = datetime.datetime.strptime('3/31/2024', '%m/%d/%Y')
secondpaymentdate = datetime.datetime.strptime('4/15/2024', '%m/%d/%Y')

dates = []
current_date = firstpaymentdate
dates.append(current_date)  # Include the first payment date

for _ in range(SM_term):
    if SM_type == '15_EOM':
        next_month = current_date.month + 1
        next_year = current_date.year
        if next_month == 13:  # December
            next_month = 1
            next_year += 1
        next_day = 15 if current_date.day == 31 else min(15, calendar.monthrange(next_year, next_month)[1])
        current_date = datetime.datetime(next_year, next_month, next_day)
        dates.append(current_date)

        last_day_of_month = (current_date.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
        dates.append(last_day_of_month)
        current_date = last_day_of_month + timedelta(days=1)

for date in dates:
    print(date.strftime("%m/%d/%Y"))

输出:

03/31/2024
04/15/2024
04/30/2024
06/15/2024
06/30/2024
08/15/2024
08/31/2024
10/15/2024
10/31/2024
12/15/2024
12/31/2024
02/15/2025
02/28/2025
04/15/2025
04/30/2025
06/15/2025
06/30/2025
© www.soinside.com 2019 - 2024. All rights reserved.