如何使用Python提取ISO 8601周编号对应的周内日期?
如何用Python提取ISO 8601周编号对应的所有日期
哦,这个需求我经常碰到!用Python处理ISO周编号其实挺顺手的,下面给你两种实用的方法,分别基于标准库和第三方库,你可以根据自己的环境选:
方法一:使用Python标准库datetime(推荐,无需额外安装)
从Python 3.8开始,datetime.date新增了fromisocalendar()方法,专门用来处理ISO周格式的日期,简直是为这个需求量身定做的!步骤很简单:
- 把ISO周编号拆成年份和周数(比如
201801拆成year=2018,week=1) - 用
fromisocalendar(year, week, 1)获取该周的周一(ISO周的第一天是周一) - 循环加上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
相关产品推荐
相关产品推荐

