从星期数开始计算日期

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

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

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

120863 次浏览

一个星期的数字不足以生成一个日期; 您还需要一个星期中的某一天。添加默认值:

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使用星期一作为一周的第一天。虽然你可以选择自己的工作日,但如果你偏离了这一点,你可能会得到意想不到的结果。

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

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

注意,如果您的周数是 ISO 周日期,那么您将希望使用 %G-W%V-%u!这些指令需要 Python 3.6或更高版本。

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

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

添加1作为工作日将产生准确的当前一周开始。加上时间差(天 = 6)就是周末。

datetime.datetime(2018, 7, 23)

为了完成其他的答案-如果你使用 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 + 中提供; 来自 医生

如果你有每年的星期数,只要把星期数加到一年中的第一天。

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

在 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一起工作。

如果有人正在寻找一个简单的函数,返回所有工作日(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']