Проверьте N-е повторение дня недели в данном месяце - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу знать, N-й раз, когда день недели происходит внутри данного месяца, на основе (Дата, День недели, Месяц и Год).

Я посмотрел на похожие вопросы:

Как я могу получить 3-ю пятницу месяца в Python?

Решения для этого вопроса сосредоточены только на 3-й пятнице, но я хочу обобщить все дни неделии получите n-й раз, который они повторяют за месяц.

Я также проверил:

Как мне получить день недели, учитывая дату в Python?

Количество дней недели в данном месяце

Но они не совсем совпадают с тем, что я ищу.

Пример: Учитываядата (1, вторник, октябрь 2019 г.), программа должна вернуть 1, потому что это первый вторник месяца;аналогично (12, суббота, октябрь 2019 г.) должно возвращаться 2, поскольку это вторая суббота месяца.

Любая помощь приветствуется. ТИА.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вот расчет, если вы хотите узнать n-й день недели месяца:

from datetime import datetime

# n 1-5 (1st-5th weekday)
# weekday 0-6 (0=Monday)
# month 1-12

def nth_weekday(n,weekday,month,year):

    if not 1 <= n <= 5:
        raise ValueError('n must be 1-5')
    if not 0 <= weekday <= 6:
        raise ValueError('weekday must be 0-6')
    if not 1 <= month <= 12:
        raise ValueError('month must be 1-12')

    # Determine the starting weekday of the month.
    start = datetime(year,month,1)
    startwday = start.weekday()

    # Compute the offset to the Nth weekday.
    day = (weekday -startwday) % 7 + 7 * (n - 1) + 1

    target = datetime(year,month,day)

    if   n == 1: postfix = 'st'
    elif n == 2: postfix = 'nd'
    elif n == 3: postfix = 'rd'
    else:        postfix = 'th'

    return f'The {n}{postfix} {target:%A} is {target:%B %d, %Y}.'


print(nth_weekday(1,4,11,2019))
print(nth_weekday(4,5,12,2019))
print(nth_weekday(4,3,1,2019))

Вывод:

The 1st Friday is November 01, 2019.
The 4th Saturday is December 28, 2019.
The 4th Thursday is January 24, 2019.
1 голос
/ 01 ноября 2019

Это на самом деле очень просто и требует простого знания дня месяца. Если дата 12 октября и это суббота, то это должна быть вторая суббота, потому что для того, чтобы быть третьей или более субботой, должно быть 14 или более дней до этого месяца, и это будет первая субботадо этого месяца в этом месяце должно быть меньше 7 дней.

Вычисление просто, как (day_of_month - 1) // 7 + 1, чтобы определить, сколько кратных 7 дней произойдет до day_of_month, а затем добавить 1. Оператор // является целочисленным делением с округлением вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...