You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python提取ISO 8601周编号对应的周内日期?

如何用Python提取ISO 8601周编号对应的所有日期

哦,这个需求我经常碰到!用Python处理ISO周编号其实挺顺手的,下面给你两种实用的方法,分别基于标准库和第三方库,你可以根据自己的环境选:

方法一:使用Python标准库datetime(推荐,无需额外安装)

从Python 3.8开始,datetime.date新增了fromisocalendar()方法,专门用来处理ISO周格式的日期,简直是为这个需求量身定做的!步骤很简单:

  1. 把ISO周编号拆成年份和周数(比如201801拆成year=2018,week=1)
  2. 用fromisocalendar(year, week, 1)获取该周的周一(ISO周的第一天是周一)
  3. 循环加上0到6天,得到整周的所有日期

代码示例:

from datetime import date, timedelta

def get_dates_from_iso_week(iso_week_str):
    # 拆分ISO周编号为年份和周数
    year = int(iso_week_str[:4])
    week = int(iso_week_str[4:])
    
    # 获取该周的周一
    monday = date.fromisocalendar(year, week, 1)
    
    # 生成整周的日期(周一到周日)
    return [monday + timedelta(days=i) for i in range(7)]

# 测试示例
dates = get_dates_from_iso_week("201801")
for d in dates:
    print(d.strftime("%Y-%m-%d"))

运行这段代码,输出的就是2018年第1周的所有日期:

2018-01-01
2018-01-02
2018-01-03
2018-01-04
2018-01-05
2018-01-06
2018-01-07

兼容Python 3.7及以下版本

如果你的Python版本比较旧,没有fromisocalendar(),可以用下面的替代方法:

from datetime import date, timedelta

def get_dates_from_iso_week_old(iso_week_str):
    year = int(iso_week_str[:4])
    week = int(iso_week_str[4:])
    
    # 先获取当年1月1日的星期几(ISO周中周一为1,周日为7)
    jan1 = date(year, 1, 1)
    jan1_iso_weekday = jan1.isoweekday()
    
    # 计算该周周一的偏移量:如果1月1日是周一到周四,直接调整;否则上一年的最后一周
    if jan1_iso_weekday <= 4:
        # 1月1日在第1周内,周一 = 1月1日 - (星期几-1)天
        monday = jan1 - timedelta(days=jan1_iso_weekday - 1)
    else:
        # 1月1日不在第1周,周一 = 1月1日 + (8 - 星期几)天
        monday = jan1 + timedelta(days=8 - jan1_iso_weekday)
    
    # 调整到目标周(注意:如果是上一年的最后一周,year要减1)
    target_monday = monday + timedelta(weeks=week - 1)
    
    # 生成整周日期
    return [target_monday + timedelta(days=i) for i in range(7)]

# 测试
dates_old = get_dates_from_iso_week_old("201801")
for d in dates_old:
    print(d.strftime("%Y-%m-%d"))

这个方法虽然麻烦点,但能兼容旧版本,结果和上面是一样的。

方法二:使用第三方库python-dateutil(更简洁)

如果你可以安装第三方库,python-dateutil的relativedelta能让代码更简洁,不需要手动计算偏移:

首先安装库:

pip install python-dateutil

然后代码:

from datetime import date
from dateutil.relativedelta import relativedelta

def get_dates_from_iso_week_dateutil(iso_week_str):
    year = int(iso_week_str[:4])
    week = int(iso_week_str[4:])
    
    # 获取该周的周一
    monday = date(year, 1, 1) + relativedelta(week=week, weekday=0)  # weekday=0代表周一
    
    # 生成整周日期
    return [monday + relativedelta(days=i) for i in range(7)]

# 测试
dates_dateutil = get_dates_from_iso_week_dateutil("201801")
for d in dates_dateutil:
    print(d.strftime("%Y-%m-%d"))

这里relativedelta(week=week, weekday=0)直接帮你定位到目标周的周一,非常省心!

需要注意的是:ISO周的定义是每周从周一开始,第1周是包含当年第一个周四的那周,所以有些年份的第1周可能会跨到上一年的年底(比如2020年第1周是2019-12-30到2020-01-05),上面的方法都能正确处理这种情况哦~

内容的提问来源于stack exchange,提问作者kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:18:11