Как я могу конвертировать из datetime в будний день константы месяца? - PullRequest
0 голосов
/ 18 декабря 2018

Что я хочу сделать, так это выяснить, какой это X месяца, и вернуть для него относительную дельта-константу (Su Mo Tu...).Я нашел много примеров прыжков к определенному дню месяца ( 1 ).Например, сегодня 3-й вторник декабря, и я могу сделать это следующим образом: + relativedelta(month=12, day=1, weekday=TU(3))), но я хочу сделать наоборот: введите сегодняшнюю дату и вычтите первое число месяца и получите что-то вроде TU(3)или если это была четвертая среда, чтобы получить: WE(4)

Моя конечная цель состоит в том, чтобы затем иметь возможность перенести эту константу в другой объект месяца или timedelta и найти эквивалентный 3-й вторник или 4-ую среду и т. д....

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Это решение, которое я придумала, может быть, вы найдете его менее сложным.

Кажется, что оно примерно в 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 года - третий вторник этого месяца.

0 голосов
/ 18 декабря 2018

Хорошо. Я нашел способ, используя rrule, создать список дней в месяце, которые разделяют текущий будний день до сегодняшнего дня, тогда длина этого списка становится N-ой.Чем я использую список в качестве справочной таблицы для констант дня недели.Не проверено, будет ли это работать каждый день месяца, но это только начало.

from datetime import *; from dateutil.relativedelta import *
from dateutil.rrule import rrule, WEEKLY
import calendar

def dayofthemonth(xdate):
    daylist = [MO,TU,WE,TH,FR,SA,SU]

    thisweekday = daylist[xdate.weekday()]

    thisdaylist = list(rrule(freq=WEEKLY, dtstart=xdate+relativedelta(day=1), until=xdate, byweekday=xdate.weekday()))

    return thisweekday(len(thisdaylist))

print(dayofthemonth(datetime.today())) #correctly returns TU(+3) for 2018, 12, 18
...