从Python中的ISO周数获取日期[重复]

Posted

技术标签:

【中文标题】从Python中的ISO周数获取日期[重复]【英文标题】:Get date from ISO week number in Python [duplicate] 【发布时间】:2011-08-18 10:51:13 【问题描述】:

可能重复:What’s the best way to find the inverse of datetime.isocalendar()?

我有一个 ISO 8601 年和周编号,我需要将其转换为该周第一天(星期一)的日期。我该怎么做?

datetime.strptime() 接受 %W%U 指令,但两者都不遵守 datetime.isocalendar() 使用的 ISO 8601 工作日规则。

更新: Python 3.6 支持 libc 中也存在的 %G%V%u 指令,从而允许这种单行:

>>> datetime.strptime('2011 22 1', '%G %V %u')
datetime.datetime(2011, 5, 30, 0, 0)

更新2:Python 3.8添加了fromisocalendar()方法,更加直观:

>>> datetime.fromisocalendar(2011, 22, 1)
datetime.datetime(2011, 5, 30, 0, 0)

【问题讨论】:

为什么不优雅?您可以通过 google 找到的其他选项更加难看。 我找到了一个很好的答案的相关问题:***.com/questions/304256/… 我看到在 php strftime() 和 libc strptime() 中提到了 %V 指令,但显然 Python 没有实现它。我在上面发布的链接中选择了解决方案。 【参考方案1】:

使用isoweek module,您可以这样做:

from isoweek import Week
d = Week(2011, 40).monday()

【讨论】:

这绝对是最实用的方法,尤其是当您对 ISO 周数进行大量操作时。【参考方案2】:

%W 将第一个星期一作为第 1 周,但 ISO 将第 1 周定义为包含 1 月 4 日。所以结果来自

datetime.strptime('2011221', '%Y%W%w')

如果第一个星期一和 1 月 4 日在不同的星期,则减一。 如果 1 月 4 日是星期五、星期六或星期日,则属于后者。 所以以下应该工作:

from datetime import datetime, timedelta, date
def tofirstdayinisoweek(year, week):
    ret = datetime.strptime('%04d-%02d-1' % (year, week), '%Y-%W-%w')
    if date(year, 1, 4).isoweekday() > 4:
        ret -= timedelta(days=7)
    return ret

【讨论】:

以上是关于从Python中的ISO周数获取日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 T-SQL 中的周数获取日期

算法:根据周数获取明年日期工作班次类型

Elixir/Phoenix 日期从工作日 + 周数

从T-SQL中的周数中获取日期

从SQL Server中的周数获取周开始日期和周结束日期

2019 年 4 月 6 日之后从 Location.getTime 返回的日期错误(周数翻转)