从周数获取日期

Ali*_*MAR 68 python datetime strptime

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

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Run Code Online (Sandbox Code Playgroud)

显示"2013-01-01 00:00:00",谢谢.

Mar*_*ers 127

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

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

-1-%w模式告诉解析器挑周一在那一周.这输出:

2013-07-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

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

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

当与使用strptime()方法,%U%W指定了一周,一年中的一天,在计算仅使用.

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

  • 不行.datetime.datetime.strptime("2018-W0-0","%YW%W-%w")== datetime.datetime.strptime("2018-W1-0","%YW%W-%w") - >"2018-01-07 00:00:00".2018年第1周和第2周的开始日期相同. (2认同)
  • @ ozw1z5rd:这是因为2018年没有第0周。第0周是一年中第一个星期一之前的不完整的一周;在2018年的第一个星期一是1月1日。换句话说,这里的问题是*您的输入字符串*,而不是技术,Python进行了纠错,将W0解释为W1。 (2认同)

Jen*_*ein 22

在 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)
Run Code Online (Sandbox Code Playgroud)

在较旧的 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))
Run Code Online (Sandbox Code Playgroud)

两者都适用于datetime.datetime.


Luk*_*elj 11

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

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

%G%V%u是ISO当量%Y%W%w,所以这个输出:

2013-06-24 00:00:00
Run Code Online (Sandbox Code Playgroud)

Python 3.6及更高版本中的Availabe;来自docs


小智 7

import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Run Code Online (Sandbox Code Playgroud)

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

datetime.datetime(2018, 7, 23)
Run Code Online (Sandbox Code Playgroud)