В Python как я могу получить дату, основанную на годе, номере недели и дне недели? [дубликат]


На этот вопрос уже есть ответ здесь:

Учитывая значение даты и число, я хочу посмотреть, как это число сравнивается с одним для эквивалентного дня в предыдущие годы.

Для "эквивалентного дня" я имею в виду тот же номер недели и тот же день недели, а не тот же самый календарная дата.

Например, начиная с даты 25 мая 1975 года:
>>> holyGrail = datetime.datetime(1975,5,25)
Который является седьмым днем 21-й недели:
>>> holyGrail.isocalendar()
(1975, 21, 7)
>>>
Я хочу поднять даты 7-го дня 21-й недели для 1974, 1973 и т. д..

По существу, я хочу сделать что-то вроде этого:

>>> yearBack = datetime.datetime().isocalendar(1974,21,7)

И пусть он вернет мне дату, соответствующую этой неделе и буднему Дню, которая в данном случае будет 26 мая 1974 года, а не 25-го:

>>> yearBack = datetime.datetime(1974,5,26)
>>> yearBack.isocalendar()
(1974, 21, 7)
>>>

Я вижу из https://stackoverflow.com/a/28069361/5324657 что существует (недокументированный?) format %V to strftime(), возвращая номер недели ISO-8601, который хорошо работает в strftime и кажется тем, что мне нужно, однако, когда я пытаюсь использовать тот же формат %V в strptime(), я получаю ошибку

ValueError: 'V' is a bad directive in format '%Y-%V-%w'

Как я могу легко / надежно вытащить эквивалентные даты года / Недели/дня недели, возвращающиеся во времени?

Обратите внимание, что меня на самом деле не волнует, когда начинаются недели или что составляет полную неделю в течение Нового года, я просто нужен последовательный метод, который позволит проводить точные годовые сравнения.

1 2

1 ответ:

Я думаю, что это должно сработать:

def getDate(d, y):
    s = datetime.date(y, 1, 1)
    while s.isocalendar()[2] != 4:
        s += datetime.timedelta(days=1)
    s += datetime.timedelta(weeks=d.isocalendar()[1]-1,
                            days=d.isocalendar()[2]-s.isocalendar()[2])
    if d.isocalendar()[-2:] == s.isocalendar()[-2:]:
         return s
    raise ValueError("{} has no equivalent in {}".format(d, y))
В григорианском календаре некоторые годы имеют 52 недели, а некоторые-53, поэтому не всегда существует эквивалентная дата. Это повысит ценность Error в этих случаях.
>>>print(getDate(datetime.date(1975, 5, 25), 1974))
1974-05-26

>>>print(getDate(datetime.date(1975, 5, 25), 1973))
1973-05-27

>>>print(getDate(datetime.date(1975, 5, 25), 1972))
1972-05-28

>>>print(getDate(datetime.date(1904, 1, 03), 1978))
ValueError: 1904-01-03 has no equivalent in 1978