如何生成每月第4个周一重置的跨年月度周序号序列?
需求:生成每月第4个周一重置的周序号序列
这是此前已解决问题的同类需求:需要基于给定的日期列表生成周序号序列,核心规则为序列在每月的第4个周一重置计数——周序号从1开始递增,到每月第4个周一后,后续日期的序号重新从1开始计算。
实现方案(Python + Pandas)
核心逻辑
- 为每个日期确定其所在月份的第4个周一(若当月无第4个周一,则取当月最后一个周一作为重置点)
- 分两段计算周序号:
- 当月第4个周一及之前的日期:从当月首日起按周递增计数
- 当月第4个周一之后的日期:从重置点次日起重新从1开始计数
代码示例
import pandas as pd import numpy as np # 替换为你的实际日期列表 date_list = pd.date_range(start='2024-01-01', end='2024-03-31', freq='D') df = pd.DataFrame({'date': date_list}) # 定义函数:获取指定日期所在月份的第4个周一 def get_month_fourth_monday(date): # 获取当月第一天 first_day = date.replace(day=1) # 计算当月第一个周一 first_monday = first_day + pd.Timedelta(days=(0 - first_day.weekday() + 7) % 7) # 第4个周一 = 第一个周一 + 21天 fourth_monday = first_monday + pd.Timedelta(days=21) # 若计算出的日期超出当月,则取当月最后一个周一 if fourth_monday.month != date.month: last_day = date.replace(day=pd.Period(date.strftime('%Y-%m')).days_in_month) fourth_monday = last_day - pd.Timedelta(days=(last_day.weekday() - 0 + 7) % 7) return fourth_monday # 为每个日期匹配对应的重置点(第4个周一) df['reset_date'] = df['date'].apply(get_month_fourth_monday) # 计算周序号 df['week_sequence'] = np.where( df['date'] <= df['reset_date'], # 重置点之前:从当月首日开始按周计数 ((df['date'] - df['date'].dt.replace(day=1)).dt.days // 7) + 1, # 重置点之后:从重置点次日开始重新计数 ((df['date'] - (df['reset_date'] + pd.Timedelta(days=1))).dt.days // 7) + 1 ) # 查看结果 print(df[['date', 'reset_date', 'week_sequence']])
说明
- 重置点处理:部分月份(如28天的二月)可能不存在第4个周一,此时自动取当月最后一个周一作为序列重置的节点
- 计数逻辑:严格按照自然周分段,每7天为一个周期,序号始终从1开始递增,符合常规周计数习惯
内容的提问来源于stack exchange,提问作者Ami Khan
相关产品推荐
相关产品推荐

