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

如何用pandas提取月内日历周列?替代固定7天周期计算

按日历周规则提取月内周数列

需求说明

需要从日期数据中提取月内日历周列,规则为:每月第一天为第1周,第一个周一之后进入第2周,以此类推(替代现有按固定7天分段的逻辑)。

测试数据

import pandas as pd

data = pd.DataFrame(pd.date_range('1/1/2000', periods=100, freq='D'), columns=['date'])

现有代码问题

当前代码按固定7天周期拆分(1-7日为第1周,8-14日为第2周),完全不考虑日历周的周一起始规则,不符合需求:

import math

def add_week_of_month(df):
    df['monthweek'] = pd.to_numeric(df.index.day/7)
    df['monthweek'] = df['monthweek'].apply(lambda x: math.ceil(x))
    return df

解决方案

以下代码实现按「月第一天为第1周,第一个周一开始为第2周」的规则计算月内周数,同时处理跨月周、月第一天为周一等边界情况:

import pandas as pd

def add_calendar_week_of_month(df):
    # 确保日期列是datetime类型
    df['date'] = pd.to_datetime(df['date'])
    
    # 获取每个日期所在月份的第一天
    df['month_start'] = df['date'].dt.to_period('M').dt.start_time
    
    # 计算当月第一个周一的日期:如果月第一天是周一则为当天,否则为当月第一个周一
    df['first_monday'] = df['month_start'] + pd.DateOffset(
        days=lambda x: (0 - x.dayofweek + 7) % 7
    )
    
    # 计算月内周数:
    # - 月第一天到第一个周一(含)为第1周
    # - 第一个周一之后,每过7天进一周
    df['monthweek'] = df.apply(
        lambda row: 1 if row['date'] <= row['first_monday'] 
        else ((row['date'] - row['first_monday']).days // 7) + 2,
        axis=1
    )
    
    # 清理中间辅助列
    df.drop(['month_start', 'first_monday'], axis=1, inplace=True)
    return df

# 测试使用
result = add_calendar_week_of_month(data)
print(result.head(10))

规则说明

  • 若月第一天是周一:当天为第1周,次日起进入第2周
  • 若月第一天是周三:1-周一前一天为第1周,周一开始为第2周
  • 后续每经过一个周一,周数加1

输出示例(前10行)

date  monthweek
0 2000-01-01          1
1 2000-01-02          1
2 2000-01-03          1
3 2000-01-04          2
4 2000-01-05          2
5 2000-01-06          2
6 2000-01-07          2
7 2000-01-08          2
8 2000-01-09          2
9 2000-01-10          3

(注:2000年1月1日是周六,1月3日是当月第一个周一,因此1-3日为第1周,4日起进入第2周,10日(下一个周一)进入第3周)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:55:20