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

