Python按月份与第N个工作日分组DataFrame的方法求助
按「月份、第N个工作日」分组统计的实现方案
假设你的DataFrame索引为DatetimeIndex(若不是,先执行data.index = pd.to_datetime(data.index)转换),以下分两种场景实现:
场景1:按「月份 + 第N个周几」分组(如1月第2个周一、3月第1个周五)
这是对应你需求逻辑的核心实现:
- 生成辅助列,标记每行数据所属的月份、周几,以及该周几在当月是第几次出现
- 基于辅助列分组求和
import pandas as pd # 1. 添加辅助列 data['month'] = data.index.month # 0=周一,1=周二...6=周日 data['weekday'] = data.index.weekday # 计算每个月内,当前周几是第几次出现(+1是为了从第1个开始计数) data['nth_weekday'] = data.groupby(['month', 'weekday']).cumcount() + 1 # 2. 分组求和 # 方式1:按(月份, 周几, 第N个)的元组分组 sum_result = data.groupby(['month', 'weekday', 'nth_weekday']).sum() # 方式2:生成更直观的分组名称(如"1月-第2个周一")后分组 data['group_label'] = data.apply( lambda row: f"{row['month']}月-第{row['nth_weekday']}个{['周一','周二','周三','周四','周五','周六','周日'][row['weekday']]}", axis=1 ) sum_result = data.groupby('group_label').sum()
场景2:按「月份 + 当月第N个工作日(仅工作日,排除周末)」分组
如果需求是统计每月第1、2、3...个工作日(仅周一至周五,不管周几):
import pandas as pd # 1. 筛选工作日(周一至周五,weekday <5) workday_data = data[data.index.weekday < 5].copy() # 2. 计算每个月内的工作日序号 workday_data['nth_workday'] = workday_data.groupby(workday_data.index.month).cumcount() + 1 # 3. 分组求和 sum_result = workday_data.groupby([workday_data.index.month, 'nth_workday']).sum()
内容的提问来源于stack exchange,提问作者Minichua
相关产品推荐
相关产品推荐

