从周数获取日期

时间:2013-06-13 12:39:50

标签: python datetime strptime

请问我的代码有什么问题:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

显示“2013-01-01 00:00:00”,谢谢。

6 个答案:

答案 0 :(得分:108)

周数不足以生成日期;你也需要一周中的一天。添加默认值:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)

-1-%w模式告诉解析器选择该周的星期一。这输出:

2013-07-01 00:00:00

%W使用星期一作为一周的第一天。虽然你可以选择自己的工作日,但如果你偏离它,可能会得到意想不到的结果。

请参阅文档中的strftime() and strptime() behaviour部分,脚注4:

  

strptime()方法一起使用时,%U%W仅用于指定星期几和年份的计算。

注意,如果您的周数为ISO week date,则您需要使用%G-W%V-%u代替!这些指令需要Python 3.6或更高版本。

答案 1 :(得分:5)

要完成其他答案-如果您使用的是 ISO 周号,则此字符串是适当的(获取给定ISO周号的星期一):

import datetime
d = '2013-W26'
datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)

%G%V%u%Y%W%w的ISO等效,因此输出:

2013-06-24 00:00:00

Python 3.6及更高版本中的可用功能;来自docs

答案 2 :(得分:3)

import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

将1添加为工作日将产生确切的当前星期开始时间。添加timedelta(days = 6)将给您一周的结束时间。

datetime.datetime(2018, 7, 23)

答案 3 :(得分:1)

如果您有每年的星期几,只需将星期数添加到一年的第一天。

>>> import datetime
>>> from dateutil.relativedelta import relativedelta

>>> week = 40
>>> year = 2019
>>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
>>> date
datetime.date(2019, 10, 8)

答案 4 :(得分:0)

这里是handy function,其中包括零周问题。

答案 5 :(得分:0)

在Python 3.8中,有一个方便的datetime.date.fromisocalendar

>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)

在较早的Python版本(3.7-)中,计算可以使用来自datetime.date.isocalendar的信息来计算出符合ISO8601标准的星期数:

from datetime import date, timedelta

def monday_of_calenderweek(year, week):
    first = date(year, 1, 1)
    base = 1 if first.isocalendar()[1] == 1 else 8
    return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))

两者都可以与datetime.datetime一起使用。