需求:
违约金应当按照合同约定分段计算至本判决确定之日止,即逾期90日内按日万分之一计算、逾期90日至210日按日万分之二计算、逾期210天按日万分之四计算。
违约金具体计算方法为:
2016年12月份的租金X元,违约金从2017年1月1日开始按日万分之一计算90天,91天至210天按日万分之二计算,211天以后按日万分之四计算;
2017年1月份的租金X元,违约金从2017年2月1日开始按日万分之一计算90天,91天至210天按日万分之二计算,211天以后按日万分之四计算
以此类推
方案:
首先利用datetime, calendar模块,生成每个月违约起始日期
然后计算违约起始日期与终止日期之间的违约天数
最后计算每个月租金的违约金额
代码:
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 10 14:49:51 2022
@author: lenovo
"""
import pandas as pd
import calendar as cal
import datetime
def monthmoney(time,initialmoney):
money = 0
while time > 0:
if time > 210 :
days = time - 210
money += days * initialmoney *0.0004
time -= days
if time > 90:
days = time - 90
money += days * initialmoney *0.0002
time -= days
else:
days = time
money += days * initialmoney *0.0001
time -= days
return money
def getmonth(start,end):
FORMATmonth = "%d-%d"
monthlist=[]
caldaylist =[]
cur = start
while cur < end:
startcalday = cur + datetime.timedelta(days=1)
month = FORMATmonth % (cur.year, cur.month)
monthlist.append(month)
caldaylist.append(startcalday)
d = int(cal.monthrange(startcalday.year, startcalday.month)[1])
cur += datetime.timedelta(days=d)
return monthlist,caldaylist
if __name__ == '__main__':
#本金
initialmoney = 4452.05
#违约起始日期:输入违约起始月份的最后一天作为违约起始日期
startdate =datetime.datetime.strptime('2016-12-31', '%Y-%m-%d')
#违约终止日期:输入违约终止月份的最后一天作为违约终止日期
enddate =datetime.datetime.strptime('2021-12-31', '%Y-%m-%d')
monthlist,caldaylist = getmonth(startdate,enddate)
#print(monthlist)
#print(caldaylist)
lista = []
for i in range(len(monthlist)):
start = caldaylist[i]
days = (enddate-start).days+1
im = monthmoney(days,initialmoney)
resi =[]
resi.append(monthlist[i])
resi.append(caldaylist[i])
resi.append(days)
resi.append(im)
lista.append(resi)
name=['月份','违约起始日期','违约天数','违约金额']
test=pd.DataFrame(columns=name,data=lista)
print(test)
test.to_csv('违约金额.csv',encoding='utf-8')
输出文件如下: