在 Python 中,如何根据年份、周数和工作日获取日期?

In Python how can I get a date based on a year, week number & weekday?

给定一个日期值和一个数字,我想看看该数字与前几年相同日期的数字相比如何。

对于 'equivalent day',我指的是相同的周数和相同的工作日,而不是相同的日历日期。

例如,从 1975 年 5 月 25 日这样的日期开始:

>>> holyGrail = datetime.datetime(1975,5,25)

也就是第 21 周的第七天:

>>> holyGrail.isocalendar()
(1975, 21, 7)
>>>

我想调出1974、1973等第21周第7天的日期。

基本上我想做这样的事情:

>>> yearBack = datetime.datetime().isocalendar(1974,21,7)

让我 return 匹配那个星期和工作日的日期,在这种情况下是 1974 年 5 月 26 日,而不是 25 日:

>>> yearBack = datetime.datetime(1974,5,26)
>>> yearBack.isocalendar()
(1974, 21, 7)
>>>

我从 看到有一个(未记录的?)格式 %V 到 strftime(),returning ISO-8601 周数,在 strftime 和似乎是我需要的,但是当我尝试在 strptime() 中使用相同的 %V 格式时,我收到错误

ValueError: 'V' is a bad directive in format '%Y-%V-%w'

我怎样才能easily/reliably 提取等效的Year/WeekNo/Weekday 时间倒退的日期?

请注意,我并不真正关心周从何时开始或新年的整周是什么,我只需要一种一致的方法,以便进行准确的同比比较。

我认为这应该可行:

def getDate(d, y):
    s = datetime.date(y, 1, 1)
    while s.isocalendar()[2] != 4:
        s += datetime.timedelta(days=1)
    s += datetime.timedelta(weeks=d.isocalendar()[1]-1,
                            days=d.isocalendar()[2]-s.isocalendar()[2])
    if d.isocalendar()[-2:] == s.isocalendar()[-2:]:
         return s
    raise ValueError("{} has no equivalent in {}".format(d, y))

在公历中,有些年份有 52 周,有些年份有 53 周,因此并不总是有相同的日期。它会在这些情况下引发 ValueError。

>>>print(getDate(datetime.date(1975, 5, 25), 1974))
1974-05-26

>>>print(getDate(datetime.date(1975, 5, 25), 1973))
1973-05-27

>>>print(getDate(datetime.date(1975, 5, 25), 1972))
1972-05-28

>>>print(getDate(datetime.date(1904, 1, 03), 1978))
ValueError: 1904-01-03 has no equivalent in 1978