开发者

How to derive the week start for a given (iso) weeknumber / year in python [duplicate]

This question already has answers here: In Python, how do I find the date of the first Monday of a given week? 开发者_开发问答 (6 answers) Closed 9 years ago.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜