如何在Python中推导给定(ISO)周号/年份的周开始日期
我知道可以用 datetime.isocalendar()
这个方法来获取某个日期对应的周数。那么,如果我只有一个周数和年份,想要找出那一周的第一天,该怎么做呢?
2 个回答
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)
6
如果你只能使用标准库的话,可以这样做:
>>> datetime.datetime.strptime('2011, 4, 0', '%Y, %U, %w')
datetime.datetime(2011, 1, 23, 0, 0)