Это решение, которое я придумала, может быть, вы найдете его менее сложным.
Кажется, что оно примерно в 4 раза быстрее, что, если вы обрабатываете много дат, может сделатьразница.
from datetime import *
from dateutil.relativedelta import *
def weekDayOfTheMonth(xdate):
daylist = [MO,TU,WE,TH,FR,SA,SU]
weekday = xdate.weekday()
firstDayOfTheMonth = datetime(xdate.year, xdate.month, 1)
interval = (weekday + 7 - firstDayOfTheMonth.weekday() ) % 7
firstOfThisWeekDay = datetime(xdate.year, xdate.month, 1 + interval)
n = ((xdate.day - firstOfThisWeekDay.day) / 7) + 1
return daylist[weekday](n)
print(weekDayOfTheMonth(datetime.today()))
print(weekDayOfTheMonth(datetime(2018,11,24)))
В основном происходит следующее:
Я нахожу, какой день недели является первым днем данного месяца.
На основе этой информации я могу легко рассчитать первый день любого данного дня недели в данном месяце.
Тогда я еще проще вычислю, что, например, 18 декабря 2018 года - третий вторник этого месяца.