【发布时间】:2013-06-13 12:39:50
【问题描述】:
请问我的代码有什么问题:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
显示“2013-01-01 00:00:00”,谢谢。
【问题讨论】:
请问我的代码有什么问题:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
显示“2013-01-01 00:00:00”,谢谢。
【问题讨论】:
周数不足以生成日期;你也需要一周中的一天。添加默认值:
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 或更高版本。
【讨论】:
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
要完成其他答案 - 如果您使用 ISO 周数,则此字符串是合适的(获取给定 ISO 周数的星期一):
import datetime
d = '2013-W26'
r = 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。
【讨论】:
在 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。
【讨论】:
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
添加 1 作为工作日将产生准确的当前周开始。添加 timedelta(days=6) 将为您提供周末。
datetime.datetime(2018, 7, 23)
【讨论】:
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
如果您有每年的周数,只需将周数添加到一年的第一天。
>>> 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)
【讨论】:
如果有人正在寻找一个简单的函数,它可以返回一周数中的所有工作日(周一至周五)日期,请考虑这个(基于 accepted answer)
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']
【讨论】:
这是一个handy function,包括零周问题。
【讨论】: