使用年和周计算Python日期不正确

使用年和周计算Python日期不正确,python,date,week-number,Python,Date,Week Number,我们在计算2019年第一周的开始时遇到了一个问题 参数为年和年中的周。我们总是把一周的时间定在星期一 获取特定年份第一天的代码: from datetime import datetime result = datetime.strptime('%04d-%02d-1' % (year, week_of_year), '%Y-%W-%w').date() 这适用于大多数年份,但不适用于year=2019和week\u of_year=1的情况,Python将其计算到日期2019-01-02,

我们在计算2019年第一周的开始时遇到了一个问题

参数为
年中的周
。我们总是把一周的时间定在星期一

获取特定年份第一天的代码:

from datetime import datetime

result = datetime.strptime('%04d-%02d-1' % (year, week_of_year), '%Y-%W-%w').date()
这适用于大多数年份,但不适用于
year=2019
week\u of_year=1
的情况,Python将其计算到日期
2019-01-02
,而不是预期的
2018-12-31

我们目前解决这一问题的解决方案是:

from datetime import datetime, timedelta

result = datetime.strptime('%04d-%02d-1' % (year, week_of_year), '%Y-%W-%w').date()

# Fixes issue with Python date computing returning the incorrect date
# This only occures for some years. E.g. 2019.
offset = result.isocalendar()[1] - datetime.strptime('%04d-01-01' % year, '%Y-%m-%d').date().isocalendar()[1]
if offset > 0:
    result = result - timedelta(days=7)
关于如何解决此问题,还有其他想法吗?

咨询之后,我可以看出
%W
不遵守ISO对周计数器的定义,只是从一年中的第一个星期一开始计算。前几天计入周计数0

您可以将
%V
%G
一起尝试:

result = datetime.strptime('%04d-%02d-1' % (year, 1), '%G-%V-%w').date()

当第一周的第一天在十二月开始时,你有什么规则?例如,
(2016,1)
给出了
1月4日
和不
12月28日
,即为什么
12月31日
和不
1月7日
是正确的(注:我得到
1月7日
不是
1月2日
)@AChampion-Hmm。从2019-01-07获得周数时,它说是2而不是1。查看我的Mac日历,它还说2018-12-31的日期是2019年的第1周:p您使用的是哪一版本的Python,我使用的是3.7(和Mac),并从
2019-01-07==1
获取周数
datetime(2019,1,7)。strftime(“%W”)#“01”
(毫不奇怪,2018/12/31的周数
53
)。Python默认使用基于
0
的周数,您混合了Python基于
0
的周数和基于iso的
1
的周数。我想您只需要在
strtime()
通话中将周数设置为
0
。它将在isocalendar中为您提供一周的
1
。不幸的是,我认为它比这更复杂
isocalendar()
比我原来想象的要复杂。它基于一个完整的52周或53周的年份,因此在python中,第1周不会简单地映射到第0周,例如
datetime(2016,1,1).isocalendar()#(2015,53,5)
,以及
datetime(2013,12,31).isocalendar()#(2014,1,2)
。顺便说一句,Calendar.app只是一个基于1的日历周,相当于Python中基于0的周。您真的需要
isocalendar()