如何将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
相关产品推荐
相关产品推荐

