[Tutor] datetime: inverse of datetime.date.isocalendar()

elmar werling elmar at net4werling.de
Fri Jul 12 22:32:39 CEST 2013


Am 12.07.2013 21:36, schrieb Peter Otten:
> elmar werling wrote:
>
>> how to convert the tuble (iso_year, iso_week, iso_day) to a date object?
>>
>> I have tried the following scipt, but the results are buggy
>>
>>
>> import datetime
>>
>> date_i = datetime.date(2013, 07, 12)
>> date_iso = date_i.isocalendar()
>>
>> year = str(date_iso[0])[2:]
>> week = str(date_iso[1])
>> day = str(date_iso[2])
>>
>> date_string = year + week + day
>> date_ii = datetime.datetime.strptime(date_string,'%y%W%w').date()
>>
>> print date_i, date_iso, date_string, date_ii
>
> Here's what I came up with:
>
> import datetime
>
> def ywd_to_date(year, week, weekday):
>      """Convert (year, week, isoweekday) tuple to a datetime.date().
>
>      >>>  datetime.date(2013, 7, 12).isocalendar()
>      (2013, 28, 5)
>      >>>  ywd_to_date(2013, 28, 5)
>      datetime.date(2013, 7, 12)
>      """
>      first = datetime.date(year, 1, 1)
>      first_year, _first_week, first_weekday = first.isocalendar()
>
>      if first_year == year:
>          week -= 1
>
>      return first + datetime.timedelta(days=week*7+weekday-first_weekday)
>
> if __name__ == "__main__":
>      # perform an exhaustive adhoc test
>
>      def iterdays(start=datetime.date(datetime.MINYEAR, 1, 1)):
>          """Generate dates till the end of time aka MAXYEAR."""
>          d = start
>          one_day = datetime.timedelta(days=1)
>          try:
>              while True:
>                  yield d
>                  d += one_day
>          except OverflowError:
>              pass
>
>      for d in iterdays():
>          # does it round-trip?
>          c = ywd_to_date(*d.isocalendar())
>          assert d == c, d
>
> I don't really understand what I'm doing here, but the test code makes me
> confident that it's correct ;)
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>


Hi Peter,

your function is realy doing its job. Should be added to the datetime 
library !!

Cheers
Elmar



More information about the Tutor mailing list