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

如何从指定月份中提取归属该月份的周编号?

实现思路与代码示例

首先明确:周归属月份没有统一官方规则,完全看业务需求。你提出的规则(当月1号为周三至周日时包含上月最后一周)可以通过Python的datetime模块快速实现,核心是利用ISO周标准(周一为一周起始,周编号连续无断档)来处理。

核心逻辑

  1. 确定目标月份的第一天和最后一天。
  2. 根据当月1号的星期数,判断是否需要将上月最后一周纳入。
  3. 遍历从起始周到结束周的所有周,整理出符合要求的周编号。

代码实现

import datetime

def get_target_weeks(target_year, target_month):
    # 获取当月首尾日期
    first_day = datetime.date(target_year, target_month, 1)
    last_day = datetime.date(target_year, target_month + 1, 1) - datetime.timedelta(days=1)
    
    # 获取首尾日期的ISO周信息(年、周数、星期几)
    first_iso_year, first_iso_week, _ = first_day.isocalendar()
    last_iso_year, last_iso_week, _ = last_day.isocalendar()
    
    # 确定起始周:1号是周三(weekday=2)到周日(weekday=6)时,往前推一周
    start_year, start_week = first_iso_year, first_iso_week
    if first_day.weekday() >= 2:
        start_week -= 1
        # 处理跨年情况(比如1月1号是周三,起始周是上一年最后一周)
        if start_week == 0:
            start_year -= 1
            start_week = datetime.date(start_year, 12, 31).isocalendar()[1]
    
    # 收集所有目标周
    target_weeks = []
    current_year, current_week = start_year, start_week
    while (current_year, current_week) <= (last_iso_year, last_iso_week):
        target_weeks.append((current_year, current_week))
        # 周数递增,处理跨年周切换
        current_week += 1
        max_week_of_year = datetime.date(current_year, 12, 31).isocalendar()[1]
        if current_week > max_week_of_year:
            current_year += 1
            current_week = 1
    
    # 格式化为你需要的"周XX"样式,跨年周标注年份
    formatted_weeks = []
    for y, w in target_weeks:
        if y == target_year:
            formatted_weeks.append(f"周{w:02d}")
        else:
            formatted_weeks.append(f"{y}年周{w:02d}")
    
    return formatted_weeks

# 测试2023年2月,输出:['周05', '周06', '周07', '周08']
print(get_target_weeks(2023, 2))

说明

  • 用isocalendar()获取的ISO周是国际通用标准,避免了不同周起始日的混乱(你的例子里周05是30/01-05/03,正好是ISO周的周一到周日)。
  • 自动处理跨年场景,比如1月1号是周三时,会自动纳入上一年的最后一周。
  • 如果API的周起始日不是周一(比如周日),只需调整weekday()的判断条件即可(比如周日为起始日时,weekday()返回0=周日,此时1号是周三对应值为3,判断条件改为first_day.weekday() >=3)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:30:42