121

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

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

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

4

7 回答 7

226

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

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

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

2013-07-01 00:00:00

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

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

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

请注意,如果您的周数是ISO week date,您将需要%G-W%V-%u改用!这些指令需要 Python 3.6 或更高版本。

于 2013-06-13T12:44:33.203 回答
36

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

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

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

2013-06-24 00:00:00

在 Python 3.6+ 中可用;来自文档

于 2019-01-04T04:47:28.670 回答
30

在 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.

于 2019-12-05T17:58:56.497 回答
7
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

添加 1 作为工作日将产生确切的当前周开始。添加 timedelta(days=6) 将为您提供周末。

datetime.datetime(2018, 7, 23)
于 2018-07-23T07:17:57.893 回答
2

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

>>> 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)
于 2019-10-04T07:14:58.323 回答
1

如果有人正在寻找一个从一周数返回所有工作日(Mo-Fr)日期的简单函数,请考虑这个(基于接受的答案

import datetime

def weeknum_to_dates(weeknum):
    return [datetime.datetime.strptime("2021-W"+ str(weeknum) + str(x), "%Y-W%W-%w").strftime('%d.%m.%Y') for x in range(-5,0)]

weeknum_to_dates(37)

输出:

['17.09.2021', '16.09.2021', '15.09.2021', '14.09.2021', '13.09.2021']
于 2021-09-13T09:32:44.790 回答
0

这是一个方便的功能,包括零周问题。

于 2018-07-05T15:05:40.800 回答