Сколько будних, праздничных или выходных дней приходится на диапазон дат

У меня есть ситуация, когда у меня есть код, с помощью которого я обрабатываю данные для отработанных смен.

В нем у меня есть массивы для начала и конца смены (например, shift_start[0] и shift_end[0] для смены №1), а для времени между ними мне нужно знать, сколько будних, праздничных или выходных дней.

Праздники я уже определил в массиве записей даты и времени, которые должны представлять праздники определенной страны (это не то же самое, что здесь, и я пока не ищу здесь дополнительных более динамичных вариантов).

В общем у меня так:

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)]

Я ищу варианты прохождения каждого из трех диапазонов и сопоставления количества дней, которые он содержит (например, первый диапазон должен содержать 2 рабочих дня, второй - один выходной день)

Объекты datetime имеют метод weekday, который вы можете использовать

FObersteiner 21.03.2022 18:40

И как мне перебирать периоды?

Anton Todorov 22.03.2022 08:18
for start, end in zip(started, ended):
gimix 22.03.2022 08:47

@gimix, Спасибо! Но что такое итератор для этого цикла? Кажется, я не могу легко найти такие примеры.. На самом деле, не могли бы вы привести хороший пример, пожалуйста?

Anton Todorov 22.03.2022 09:25

Из документов: zip «Возвращает итератор кортежей, где i-й кортеж содержит i-й элемент из каждой из последовательностей аргументов или итераций». Таким образом, на каждой итерации у вас будет в start и end соответственно один элемент из started и соответствующий элемент из ended

gimix 22.03.2022 10:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поэтому, основываясь на предложении @gimix, я смог разработать то, что мне было нужно:

        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)

Другие вопросы по теме