Проблема в том, что monthdatescalendar
возвращает вложенный список:
>>> import calendar
>>> cal = calendar.Calendar()
>>> cal.monthdatescalendar(2019, 1)
[[datetime.date(2018, 12, 31),
datetime.date(2019, 1, 1),
datetime.date(2019, 1, 2),
datetime.date(2019, 1, 3),
datetime.date(2019, 1, 4),
datetime.date(2019, 1, 5),
datetime.date(2019, 1, 6)],
[datetime.date(2019, 1, 7),
datetime.date(2019, 1, 8),
datetime.date(2019, 1, 9),
datetime.date(2019, 1, 10),
...
Итак, если вы хотите сохранить ту же структуру, чтобы получить только вторые днинеделю, вы можете сделать следующее:
>>> filtered_month = [[day for day in week if day.weekday() == 1]
for week in cal.monthdatescalendar(2019, 1)]
>>> filtered_month
[[datetime.date(2019, 1, 1)],
[datetime.date(2019, 1, 8)],
[datetime.date(2019, 1, 15)],
[datetime.date(2019, 1, 22)],
[datetime.date(2019, 1, 29)]]
Другой вариант - использовать itermonthdates
, но список будет плоским:
>>> [day for day in cal.itermonthdates(2019, 1) if day.weekday() == 1]
[datetime.date(2019, 1, 1),
datetime.date(2019, 1, 8),
datetime.date(2019, 1, 15),
datetime.date(2019, 1, 22),
datetime.date(2019, 1, 29)]
Также обратите вниманиечто вы можете указать первый день календаря при создании объекта Calendar
.Затем, чтобы получить первые дни недели, вам просто нужно взять первые элементы списков:
>>> cal = calendar.Calendar(calendar.TUESDAY)
>>> [week[0] for week in cal.monthdatescalendar(2019, 1)]
[datetime.date(2019, 1, 1),
datetime.date(2019, 1, 8),
datetime.date(2019, 1, 15),
datetime.date(2019, 1, 22),
datetime.date(2019, 1, 29)]
PS:
В качестве примечания, я думаю, что этолучше сравнить дни явно следующим образом:
if day.weekday() == calendar.TUESDAY:
...
вместо
if day.weekday() == 1:
...
Поскольку Explicit лучше, чем неявный .