在 Python 中从 ISO 周数获取日期

发布于 2024-11-05 07:29:23 字数 1356 浏览 1 评论 0原文

可能的重复:
查找日期时间倒数的最佳方法是什么.isocalendar()?

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

datetime.strptime() 同时采用 % W%U 指令,但都不遵守 ISO 8601 工作日规则 datetime.isocalendar() 使用。

更新: Python 3.6 支持 < libc 中还存在 code>%G、%V%u 指令,允许这一行:

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

更新 2: <一href="https://docs.python.org/3/library/datetime.html#datetime.date.fromisocalendar" rel="nofollow noreferrer">Python 3.8 添加了 fromisocalendar() 方法,更直观:

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

Possible Duplicate:
What’s the best way to find the inverse of datetime.isocalendar()?

I have an ISO 8601 year and week number, and I need to translate this to the date of the first day in that week (Monday). How can I do this?

datetime.strptime() takes both a %W and a %U directive, but neither adheres to the ISO 8601 weekday rules that datetime.isocalendar() use.

Update: Python 3.6 supports the %G, %V and %u directives also present in libc, allowing this one-liner:

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

Update 2: Python 3.8 added the fromisocalendar() method, which is even more intuitive:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

物价感观 2024-11-12 07:29:23

使用 isoweek 模块,你可以这样做:

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

With the isoweek module you can do it with:

from isoweek import Week
d = Week(2011, 40).monday()
十六岁半 2024-11-12 07:29:23

%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

%W takes the first Monday to be in week 1 but ISO defines week 1 to contain 4 January. So the result from

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

is off by one iff the first Monday and 4 January are in different weeks.
The latter is the case if 4 January is a Friday, Saturday or Sunday.
So the following should work:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文