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

如何生成每月第4个周一重置的跨年月度周序号序列?

需求:生成每月第4个周一重置的周序号序列

这是此前已解决问题的同类需求:需要基于给定的日期列表生成周序号序列,核心规则为序列在每月的第4个周一重置计数——周序号从1开始递增,到每月第4个周一后,后续日期的序号重新从1开始计算。

实现方案(Python + Pandas)

核心逻辑

  1. 为每个日期确定其所在月份的第4个周一(若当月无第4个周一,则取当月最后一个周一作为重置点)
  2. 分两段计算周序号:
    • 当月第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:03:13