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

Python实现按周一重置的日期列表分组为周子列表

日期列表按周分组并格式化转换

需求说明

现有日期字符串列表diasformated:

['Wednesday, 2023-02-01', 'Thursday, 2023-02-02', 'Friday, 2023-02-03', 'Saturday, 2023-02-04', 'Monday, 2023-02-06', 'Tuesday, 2023-02-07', 'Wednesday, 2023-02-08', 'Thursday, 2023-02-09', 'Friday, 2023-02-10', 'Saturday, 2023-02-11', 'Monday, 2023-02-13', 'Tuesday, 2023-02-14', 'Wednesday, 2023-02-15', 'Thursday, 2023-02-16', 'Friday, 2023-02-17', 'Saturday, 2023-02-18', 'Monday, 2023-02-20', 'Tuesday, 2023-02-21', 'Wednesday, 2023-02-22', 'Thursday, 2023-02-23', 'Friday, 2023-02-24', 'Saturday, 2023-02-25', 'Monday, 2023-02-27', 'Tuesday, 2023-02-28']

需要完成:

  • 以周一为周起始将列表分组为子列表(每个子列表对应当月的一周)
  • 将每个日期字符串中的逗号、横杠替换为下划线

原代码运行时出现索引越界错误,结果不符合预期,原代码如下:

ndays=end_dt-start_dt
weeks = calendar.monthcalendar(year, month_num)
nweeks = len(weeks)
turnlist=[[] for e in range(0,nweeks)]

conteo1=0
for i in range(len(turnlist)):
    for j in range(len(diasformated)):
        while len(turnlist[i])<6 or 'Monday' not in diasformated[j]:
            turnlist[i].append(diasformated[j+conteo1])
            conteo1+=1 

修正后的代码

import calendar
import datetime

# 设置周起始为周一
calendar.setfirstweekday(calendar.MONDAY)

diasformated = ['Wednesday, 2023-02-01', 'Thursday, 2023-02-02', 'Friday, 2023-02-03', 'Saturday, 2023-02-04', 'Monday, 2023-02-06', 'Tuesday, 2023-02-07', 'Wednesday, 2023-02-08', 'Thursday, 2023-02-09', 'Friday, 2023-02-10', 'Saturday, 2023-02-11', 'Monday, 2023-02-13', 'Tuesday, 2023-02-14', 'Wednesday, 2023-02-15', 'Thursday, 2023-02-16', 'Friday, 2023-02-17', 'Saturday, 2023-02-18', 'Monday, 2023-02-20', 'Tuesday, 2023-02-21', 'Wednesday, 2023-02-22', 'Thursday, 2023-02-23', 'Friday, 2023-02-24', 'Saturday, 2023-02-25', 'Monday, 2023-02-27', 'Tuesday, 2023-02-28']

# 1. 批量格式化日期:替换逗号、横杠为下划线
formatted_dates = [date.replace(',', '_').replace('-', '_') for date in diasformated]

grouped_weeks = []
current_group = []

for date_str in formatted_dates:
    # 解析日期字符串为datetime对象,用于判断周数
    date_part = date_str.split('_')[1].replace('_', '-')
    current_dt = datetime.datetime.strptime(date_part, '%Y-%m-%d')
    current_week = current_dt.isocalendar()[1]

    if not current_group:
        current_group.append(date_str)
    else:
        # 获取当前组第一个日期的周数
        first_date_part = current_group[0].split('_')[1].replace('_', '-')
        first_dt = datetime.datetime.strptime(first_date_part, '%Y-%m-%d')
        first_week = first_dt.isocalendar()[1]

        if current_week == first_week:
            current_group.append(date_str)
        else:
            grouped_weeks.append(current_group)
            current_group = [date_str]
# 加入最后一组未完成的分组
if current_group:
    grouped_weeks.append(current_group)

# 打印结果
for week in grouped_weeks:
    print(week)

原代码问题分析

  1. 索引越界:j+conteo1的累加逻辑会不断超出diasformated的列表长度,直接触发索引错误。
  2. 分组逻辑混乱:嵌套循环+while的组合没有正确判断日期所属周,无法实现按周一为起始的分组需求。
  3. 未处理日期格式化:原代码完全没完成逗号、横杠替换为下划线的要求。

修正思路

  1. 先统一格式化日期:用列表推导式批量替换字符,一步完成格式转换。
  2. 基于周数分组:将日期转为datetime对象,通过isocalendar()获取周数(设置周一为周起始后,该方法返回的周数符合需求),相同周数的日期归为一组。
  3. 避免手动索引操作:通过遍历+动态分组的方式,从根源避免索引越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:15:27