Search code examples
pythondatetimerangedays

How many weekdays, holidays or weekend days are within a dates range


I have a situation where I have a code with which I am processing data for operated shifts.

In it, I have arrays for start and end of shifts (e.g. shift_start[0] and shift_end[0] for shift #1), and for the time between them, I need to know how many weekdays, holidays or weekend days.

The holidays I have already defined in an array of datetime entries, which should represent the holidays of a specific country (it's not the same as here and I do not seek for further more dynamic options here yet).

So basically I have it like that:

started = [datetime.datetime(2022, 2, 1, 0, 0), datetime.datetime(2022, 2, 5, 8, 0), datetime.datetime(2022, 2, 23, 11, 19, 28)]
ended = [datetime.datetime(2022, 2, 2, 16, 0), datetime.datetime(2022, 2, 5, 17, 19, 28), datetime.datetime(2022, 4, 26, 12, 30)]

holidays = [datetime.datetime(2022, 1, 3), datetime.datetime(2022, 3, 3), datetime.datetime(2022, 4, 22), datetime.datetime(2022, 4, 25)]

I'm seeking for options to go thru each of the 3 ranges and match the number of days it contains (e.g. the first range should contain 2 weekdays, the second - one weekend day)


Solution

  • So based on the suggestion by @gimix, I was able to develop what I needed:

            for each_start, each_end in zip(started, ended):  # For each period 
                for single_date in self.daterange(each_start, each_end):  # For each day of each period
    
                    # Checking if holiday or weekend
                    if (single_date.replace(hour=0, minute=0, second=0) in holidays) or (single_date.weekday() > 4):
                        set_special_days_worked(1)
    
                    # If not holiday or weekend, then it is regular working day
                    else:
                        set_regular_days_worked(1)