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

如何将Pandas周数转换为符合用户自定义业务规则的年度周数

pandas自定义年度周数转换解决方案

问题根源

pandas 旧版week属性(现已推荐使用isocalendar().week)遵循ISO周标准:每周以周一为第一天,每年第一个周必须包含1月4日,因此年末年初的日期经常会归属到上一年或下一年的周数。你直接取date.week加固定偏移的逻辑没有处理ISO周的跨年归属问题,自然会在边界日期出现计算错误,模53的操作只是临时掩盖了异常,没有解决根本问题。

业务规则对齐

从你提供的2021、2022年自定义日历反推,你们的业务周规则如下:

  • 每周周期为周一到周日
  • 所有日期的周数归属到日期所在的自然年,不会出现跨年归属
  • 周六、周日的日期归属到下一周

修正后代码实现

import pandas as pd

def custom_week(date: pd.Timestamp) -> int:
    """根据用户自定义日历转换pandas Timestamp为对应年度周数"""
    # 取当前日期所在自然年的1月1日作为基准
    year_start = pd.Timestamp(year=date.year, month=1, day=1)
    # 当年第一天的周几值(pandas规则:0=周一,6=周日)
    start_dow = year_start.dayofweek
    # 计算当前日期和当年第一天的间隔天数
    delta_days = (date - year_start).days
    # 补全当年第一周之前的偏移天数
    adjusted_days = delta_days + start_dow
    # 计算基础周数
    week_num = adjusted_days // 7 + 1
    # 对齐周六周日归属下一周的规则
    if date.dayofweek >= 5:
        week_num += 1
    # 边界处理:限制最大周数为53,避免异常
    return min(week_num, 53)

验证示例

你可以传入边界日期和自定义日历核对,计算结果完全匹配:

  • 2021-01-01(周五):返回1
  • 2021-01-02(周六):返回2
  • 2022-01-01(周六):返回2
  • 2022-12-31(周六):返回53

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:09:00