python獲取兩個日期間的工作日


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]

    def workDays(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的所有方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM