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

基于周数划分月份并计算自定义月起始日的代码优化问询

问题描述
  • 自定义全年月份规则:部分月份为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:52:50