I know I can use datetime.isocalendar()
for getting the weeknumber given a certain date. How can I do the inverse, given a weeknumber and year retrieve the first day of that week.
If you're limited to stdlib you could do the following:
>>> datetime.datetime.strptime('2011, 4, 0', '%Y, %U, %w')
datetime.datetime(2011, 1, 23, 0, 0)
Couldn't find a standard library, so had to roll my own. Main difficulty is finding the first day of the ISO year (which could be in the previous year). You'll need to add some input checks etc...
import datetime
def isoWeekToGregorian(isoYear, isoWeek, isoDayOfWeek):
#we have to find the date of the iso year
t0 = datetime.datetime(isoYear,1,1,0,0,0)
t0iso = t0.isocalendar()
if (t0iso[1] != 1):
t0prime = t0 + datetime.timedelta(7-t0iso[2])
else:
t0prime = t0 - datetime.timedelta(t0iso[2])
#we can add our weeks and days...
return t0prime + datetime.timedelta(7*(isoWeek-1) + isoDayOfWeek)
We can create a simple test:
#TEST: we know 2004 has 53 weeks...
t0 = datetime.datetime(2004,12,26,0,0,0)
t1 = datetime.datetime(2005,1,10,0,0,0)
ndays = (t1-t0).days + 1
for i in range(ndays):
d0 = t0 + datetime.timedelta(i)
d0iso = d0.isocalendar()
if (d0 != isoWeekToGregorian(d0iso[0],d0iso[1],d0iso[2])):
print "failed: %s" % d0
else:
print d0, d0iso
Which correctly prints:
2004-12-26 00:00:00 (2004, 52, 7)
2004-12-27 00:00:00 (2004, 53, 1)
2004-12-28 00:00:00 (2004, 53, 2)
2004-12-29 00:00:00 (2004, 53, 3)
2004-12-30 00:00:00 (2004, 53, 4)
2004-12-31 00:00:00 (2004, 53, 5)
2005-01-01 00:00:00 (2004, 53, 6)
2005-01-02 00:00:00 (2004, 53, 7)
2005-01-03 00:00:00 (2005, 1, 1)
2005-01-04 00:00:00 (2005, 1, 2)
2005-01-05 00:00:00 (2005, 1, 3)
2005-01-06 00:00:00 (2005, 1, 4)
2005-01-07 00:00:00 (2005, 1, 5)
2005-01-08 00:00:00 (2005, 1, 6)
2005-01-09 00:00:00 (2005, 1, 7)
2005-01-10 00:00:00 (2005, 2, 1)
精彩评论