Okay Second try.
I like learning new things so thank you for bringing the 4-4-5 fiscal calender to my life. ;)
Since I think you only need to create this calender once and than use the finished calender as reference I thought of a stupid idea to create such a calender. Hardcoded loops.
The following code has a function that creates a 4-4-5 fiscal calender based on a start date and the number of years that should be created.
Since according to Wikipedia there is a leap week every 5 or 6 years I added the leap_week_year for you to choose in which year the leep week should go. Also a leap_week_quarter to choose which quarter should be 4-4-6.
import pandas as pd
import datetime as dt
def create_445_calender(start_date: str, years: int, leap_week_year = 5, leap_week_quarter = 4):
output = []
tmp_datetime = dt.datetime.strptime(start_date,'%d/%m/%Y')
for year in range(1,years+1):
month_of_year = 1
week_of_year = 1
# 4 quarters
for quarters in range(1,5):
# 4 weeks
for weeks in range(1,5):
# 7 days
for days in range(1,8):
tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
tmp_monthstr = str(month_of_year) if month_of_year >= 10 else '0' + str(month_of_year)
tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
tmp_datetime = tmp_datetime + dt.timedelta(days=1)
week_of_year += 1
month_of_year += 1
# 4 weeks
for weeks in range(1,5):
# 7 days
for days in range(1,8):
tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
tmp_monthstr = str(month_of_year) if month_of_year >= 10 else '0' + str(month_of_year)
tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
tmp_datetime = tmp_datetime + dt.timedelta(days=1)
week_of_year += 1
month_of_year += 1
# 5 / 6 weeks
# 5 years
if (year % leap_week_year == 0 ) and (quarters == leap_week_quarter):
tmp_weeks = 6
else:
tmp_weeks = 5
for weeks in range(1,tmp_weeks+1):
# 7 days
for days in range(1,8):
tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
tmp_monthstr = str(month_of_year) if month_of_year >= 10 else '0' + str(month_of_year)
tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
tmp_datetime = tmp_datetime + dt.timedelta(days=1)
week_of_year += 1
month_of_year += 1
df = pd.DataFrame(output,columns = ['date','day','week_no','yyyy-mm','quarter'])
return df
my445calender = create_445_calender('06/04/2020', 6, 5, 4)