从星期数获取日期


Answers:


175

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

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()strptime()行为部分的脚注4:

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

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


我希望我能给你超过1票。。。
Islam Q.

2
不起作用。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年的第一周和第二周具有相同的开始日期。
ozw1z5rd

2
@ ozw1z5rd:这是因为2018年没有第0周。第0周是一年中第一个星期一之前的不完整的一周;在2018年的第一个星期一是1月1日。换句话说,您输入的字符串是问题所在,而不是技术问题,Python已将错误更正为将W0解释为W1。
马丁·彼得斯

@ ozw1z5rd:如果这是您的应用程序遇到的问题,则需要对此类年份进行特殊处理;if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
马丁·彼得斯

1
@darda:Python 3.6已经支持ISO 8601周定义,使用%G(一周的大部分时间都使用年份),并且%V在这种情况下。
马丁·彼得斯

26

要完成其他答案-如果您使用的是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及更高版本中的Availabe;来自docs


14

在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


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

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

datetime.datetime(2018, 7, 23)

@Senthikumar C应该如下所示res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
MD Alauddin Al-Amin

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.