import datetime
class workdays:
def __init__(self, start_date, end_start, days_off=none):
"""weekday()方法將一個日期轉換對應成星期,以星期一(0)到星期天(6)結束
:param start_date: 開始時間,必須是datetime格式
:param end_start: 結束時間,必須是datetime格式
:param days_off: 休息日,預設為週六週日
"""self.start_date = start_date
self.end_date = end_start
self.days_off = days_off
if self.start_date > self.end_date: # 防止開始日期和結束日期傳入反了
self.start_date, self.end_date = self.end_date, self.start_date
if self.days_off is none: # 休息日為周
六、週日
self.days_off = 5, 6
# 每週工作日列表
self.days_work = [i for i in range(7) if i not in self.days_off]
def workdays(self): # 計算出自定義範圍內有多少個工作日,包含節假日
tag_date = self.start_date
while true:
if tag_date > self.end_date:
break
if tag_date.weekday() in self.days_work: # 判斷日期為非週末
yield tag_date
tag_date += datetime.timedelta(days=1)
def holiday(self): # 計算自定義範圍內節假日佔多少
# a股休市日期
holiday = "20210101,20210211,20210212,20210215,20210216,20210217,20210405,20210503,20210504,20210505,20210614,20210920,20210921,20211001,20211004,20211005,20211006,20211007"
holidaylist = holiday.split(",")
for i in holidaylist:
date = datetime.datetime(int(i[0:4]), int(i[4:6]), int(i[6:8]))
if self.start_date <= date <= self.end_date: # 判斷節假日在自定義的範圍內
if date.weekday() in self.days_work: # 判斷為非週末
yield date
def dayscount(self): # 計算工作日,不包含節假日
return len(list(self.workdays()))-len(list(self.holiday()))