从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周数获取日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章