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)
原代码问题分析
- 索引越界:
j+conteo1的累加逻辑会不断超出diasformated的列表长度,直接触发索引错误。 - 分组逻辑混乱:嵌套循环+while的组合没有正确判断日期所属周,无法实现按周一为起始的分组需求。
- 未处理日期格式化:原代码完全没完成逗号、横杠替换为下划线的要求。
修正思路
- 先统一格式化日期:用列表推导式批量替换字符,一步完成格式转换。
- 基于周数分组:将日期转为
datetime对象,通过isocalendar()获取周数(设置周一为周起始后,该方法返回的周数符合需求),相同周数的日期归为一组。 - 避免手动索引操作:通过遍历+动态分组的方式,从根源避免索引越界问题。
内容的提问来源于stack exchange,提问作者Arnoldo Oliva
相关产品推荐
相关产品推荐

