python獲取兩個日期間的工作日
阿新 • • 發佈:2019-01-23
結束 def 一周內 列表 sta 元素 獲取 排除 結果
import datetime # 計算兩個日期之間的工作日數,非天數. class workDays(): def __init__(self, start_date, end_date, days_off=None): """days_off:休息日,默認周六日, 以0(星期一)開始,到6(星期天)結束, 傳入tupple 沒有包含法定節假日, """ self.start_date = start_date self.end_date = end_date 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 days_off is None: self.days_off = 5,6 # 每周工作日列表 self.days_work = [x for x in range(7) if x not in self.days_off] defworkDays(self): """實現工作日的 iter, 從start_date 到 end_date , 如果在工作日內,yield 日期 """ # 還沒排除法定節假日 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 daysCount(self): """工作日統計,返回數字""" return len(list(self.workDays())) def weeksCount(self, day_start=0): """統計所有跨越的周數,返回數字 默認周從星期一開始計算 """ day_nextweek = self.start_date while True: if day_nextweek.weekday() == day_start: break day_nextweek += datetime.timedelta(days=1) # 區間在一周內 if day_nextweek > self.end_date: return 1 weeks = ((self.end_date - day_nextweek).days + 1)/7 weeks = int(weeks) if ((self.end_date - day_nextweek).days + 1)%7: weeks += 1 if self.start_date < day_nextweek: weeks += 1 return weeks
獲取結果:
import datetime startdate = datetime.datetime(2018,1,11,20,20,20) enddate = datetime.datetime(2019,1,11,20,20,20) work = workDays(startdate,enddate) # 需要傳入兩個datetime格式日期 print(list(work.workDays())) # 獲取一個元素為datetime日期格式的工作日期列表 print(work.daysCount()) # 獲取工作日期的天數 print(work.weeksCount()) # 獲取非工作日的天數 for i in work.workDays(): # 獲取每一個工作日期 print(i) print(dir(work)) # 獲取work的所有方法
python獲取兩個日期間的工作日