基于周数划分月份并计算自定义月起始日的代码优化问询
问题描述
- 自定义全年月份规则:部分月份为4周、部分为5周,以此规避自然月天数(30/31天)带来的统计混淆
- 以周日作为一周起始,需根据当前日期计算自定义月份的起始日,作为DataFrame的
datefilter筛选条件 - 现有代码通过硬编码
[13,26,39,52](5周月份的结束周数)判断月份类型,需优化为无需逐个定义条件的优雅实现
优化方案
核心思路:利用5周月份结束周数的规律(均为13的倍数),替代硬编码的列表判断,让逻辑更简洁且易于维护。
优化后的代码
import datetime import pandas as pd # 获取当前日期 today = datetime.datetime.now() # 计算当前周的起始日(周日):将周日设为一周第0天 current_weekday = today.weekday() sunday_offset = (current_weekday + 1) % 7 if sunday_offset == 0: # 当前是周日,取上一周的周日作为周起始 week_start = today - datetime.timedelta(days=7) else: week_start = today - datetime.timedelta(days=sunday_offset) # 获取该周起始日对应的ISO周数 week_num = week_start.isocalendar().week # 判断是否为5周月份的结束周:利用周数是13的倍数的规律 is_five_week_month = (week_num % 13 == 0) # 计算自定义月份的起始日(datefilter) if is_five_week_month: datefilter = today - pd.DateOffset(weeks=5) else: datefilter = today - pd.DateOffset(weeks=4) # 格式化到当天零点 datefilter = datefilter.replace(hour=0, minute=0, second=0, microsecond=0)
关键优化点
- 移除硬编码的周数列表,改用
week_num %13 ==0判断5周月份,逻辑更简洁且无需手动维护周数列表 - 变量命名更清晰(如
week_start替代原week_to_date),提升代码可读性 - 统一
today变量复用,避免多次调用datetime.datetime.now()导致的时间偏差
内容的提问来源于stack exchange,提问作者thentangler
相关产品推荐
相关产品推荐

