我正在尝试生成从 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 日
如有任何帮助,我们将不胜感激!
试试这个:
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