В 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 ответ:
Я думаю, что это должно сработать:
В григорианском календаре некоторые годы имеют 52 недели, а некоторые-53, поэтому не всегда существует эквивалентная дата. Это повысит ценность Error в этих случаях.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))
>>>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