2016-12-05 17 views
2

Учитывая значение даты и число, я хочу посмотреть, как это число сравнивается с тем, которое было в эквивалентный день в предыдущие годы.В 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, что существует (без документов?) формат% V в strftime(), возвращая ISO-8601 номер недели, который работает нормально в STRFTIME и, кажется, что мне нужно, однако, когда я пытаюсь использовать тот же формат% V в strptime() я получаю ошибку

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

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

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

+0

Дубликат http://stackoverflow.com/a/7687085/5324657, но этот удобный модуль isoweek не встроен. Есть ли встроенный способ сделать это? –

+1

Этот дублированный вопрос дает единственные встроенные способы сделать это; если ваше определение недели не соответствует Python (и вы не можете использовать Python 3.6 в соответствии со стандартами ISO strptime), то нет, нет (умеренно чистый) встроенный способ. Желание быть встроенным не делает это так. – ShadowRanger

ответ

0

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

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, так что не всегда является эквивалентом даты. В этих случаях он повысит значение ValueError.

>>>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 
+0

Это 'tm_yday' действительно полезно, но я эквивалентный день недели: я начинаю с« Воскресенье недели 21 в 1975 году », поэтому мне нужна дата« Воскресенье недели 21 »за 1974 год (26 мая) и 1973 год (27 мая) и 1972 (28 мая) и т. Д. –

+0

ОК. Я скорректировал свой ответ. –

Смежные вопросы