请问我的代码有什么问题:
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”,谢谢。
Answers:
周数不足以生成日期。您也需要一周中的某一天。添加默认值:
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或更高版本。
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(一周的大部分时间都使用年份),并且%V
在这种情况下。
要完成其他答案-如果您使用的是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。
在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")