pandas如何按自定义区间(每月25日至次月24日)对日期分组
Pandas 自定义日期区间分组实现方案
前提:默认使用Pandas处理数据,需要先保证你的日期列已转换为datetime64类型。
实现逻辑
核心是给每行数据生成对应分组的起始标识,后续直接按该标识分组聚合即可,分为两部分规则匹配:
- 首组范围固定为2021-07-14 ~ 2021-07-24,统一使用
2021-07-14作为分组标识 - 常规周期为当月25日~次月24日,统一使用周期起始的25日作为分组标识
代码实现(通用小数据量版)
import pandas as pd # 1. 转换日期列格式 df['date'] = pd.to_datetime(df['date']) # 2. 定义首组固定边界 FIRST_GROUP_START = pd.to_datetime('2021-07-14') FIRST_GROUP_END = pd.to_datetime('2021-07-24') # 3. 定义分组标识生成函数 def get_group_key(date): # 匹配首组规则 if FIRST_GROUP_START <= date <= FIRST_GROUP_END: return FIRST_GROUP_START # 匹配常规周期规则 if date.day >= 25: # 当月25及之后,归为当月25开始的分组 return pd.Timestamp(date.year, date.month, 25) else: # 当月24及之前,归为上月25开始的分组 prev_month = date.month - 1 prev_year = date.year if prev_month == 0: prev_month = 12 prev_year -= 1 return pd.Timestamp(prev_year, prev_month, 25) # 4. 生成分组标识列 df['group_key'] = df['date'].apply(get_group_key) # 5. 按分组标识聚合即可,示例为统计每组行数 group_result = df.groupby('group_key').size()
大数据量优化版(向量化操作,避免循环)
如果数据量超过10万行,apply方法性能较差,可使用numpy向量化逻辑替代:
import pandas as pd import numpy as np df['date'] = pd.to_datetime(df['date']) FIRST_GROUP_START = pd.to_datetime('2021-07-14') FIRST_GROUP_END = pd.to_datetime('2021-07-24') # 标记首组行 is_first = (df['date'] >= FIRST_GROUP_START) & (df['date'] <= FIRST_GROUP_END) # 计算常规分组的月份偏移:日>=25偏移0个月,否则偏移-1个月 month_offset = np.where(df['date'].dt.day >= 25, 0, -1) # 批量生成分组标识 df['group_key'] = np.where( is_first, FIRST_GROUP_START, (df['date'] + pd.offsets.MonthOffset(month_offset)).dt.floor('D').replace(day=25) ) # 聚合操作和上述一致 group_result = df.groupby('group_key').size()
内容的提问来源于stack exchange,提问作者user2236673
相关产品推荐
相关产品推荐

