У меня есть ситуация, когда у меня есть код, с помощью которого я обрабатываю данные для отработанных смен.
В нем у меня есть массивы для начала и конца смены (например, 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 рабочих дня, второй - один выходной день)
И как мне перебирать периоды?
for start, end in zip(started, ended):
@gimix, Спасибо! Но что такое итератор для этого цикла? Кажется, я не могу легко найти такие примеры.. На самом деле, не могли бы вы привести хороший пример, пожалуйста?
Из документов: zip
«Возвращает итератор кортежей, где i-й кортеж содержит i-й элемент из каждой из последовательностей аргументов или итераций». Таким образом, на каждой итерации у вас будет в start
и end
соответственно один элемент из started
и соответствующий элемент из ended
Поэтому, основываясь на предложении @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)
Объекты datetime имеют метод
weekday
, который вы можете использовать