Что лучший способ состоит в том, чтобы найти инверсией datetime.isocalendar ()?

45
задан Joe Doyle 30 April 2012 в 23:49
поделиться

3 ответа

Недавно мне пришлось самому решать эту проблему, и я нашел это решение:

import datetime

def iso_year_start(iso_year):
    "The gregorian calendar date of the first day of the given ISO year"
    fourth_jan = datetime.date(iso_year, 1, 4)
    delta = datetime.timedelta(fourth_jan.isoweekday()-1)
    return fourth_jan - delta 

def iso_to_gregorian(iso_year, iso_week, iso_day):
    "Gregorian calendar date for the given ISO year, week and day"
    year_start = iso_year_start(iso_year)
    return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1)

Несколько тестовых примеров:

>>> iso = datetime.date(2005, 1, 1).isocalendar()
>>> iso
(2004, 53, 6)
>>> iso_to_gregorian(*iso)
datetime.date(2005, 1, 1)

>>> iso = datetime.date(2010, 1, 4).isocalendar()    
>>> iso
(2010, 1, 1)
>>> iso_to_gregorian(*iso)
datetime.date(2010, 1, 4)

>>> iso = datetime.date(2010, 1, 3).isocalendar()
>>> iso
(2009, 53, 7)
>>> iso_to_gregorian(*iso)
datetime.date(2010, 1, 3)
65
ответ дан 26 November 2019 в 21:12
поделиться

Обратите внимание, что %W является неделей # (0-53), который НЕ является ТЕМ ЖЕ как неделей ISO (1-53). Будут пограничные случаи, где %W не будет работать.

0
ответ дан 26 November 2019 в 21:12
поделиться

РЕДАКТИРОВАНИЕ: проигнорируйте это, пограничные случаи являются болью. Пойдите с решением Ben.

хорошо, на более близком контроле я заметил, что strptime имеет %W и %w параметры, таким образом, следующие работы:

def fromisocalendar(y,w,d):
   return datetime.strptime( "%04dW%02d-%d"%(y,w-1,d), "%YW%W-%w")

Несколько глюков: недельное число ISO запускается в 1, в то время как %W запускается в 0. Недельный день ISO запускается в 1 (понедельник), который совпадает с %w, таким образом, воскресенье должно было бы, вероятно, быть 0, не 7...

-1
ответ дан Tom 26 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: