如何在python中获得给定(iso)周数/年的周开始

时间:2011-01-25 12:40:59

标签: python datetime calendar

我知道我可以使用datetime.isocalendar()来获取特定日期的周数。如果一周的数字和年份检索该周的第一天,我该怎么做反向呢。

2 个答案:

答案 0 :(得分:6)

如果您仅限于stdlib,则可以执行以下操作:

>>> datetime.datetime.strptime('2011, 4, 0', '%Y, %U, %w')
datetime.datetime(2011, 1, 23, 0, 0)

答案 1 :(得分:0)

找不到标准库,所以不得不自己滚动。主要困难是找到ISO年份的第一天(可能是上一年)。你需要添加一些输入检查......

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)

我们可以创建一个简单的测试:

#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

哪个正确打印:

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)