如何用Python Pandas按自定义月度日期范围分组数据?
按自定义月度日期范围分组的解决方案
要实现从每月26日到次月25日的分组逻辑,无法直接通过pd.Grouper的默认频率实现,需要手动生成匹配自定义范围的分组键,具体步骤如下:
1. 确保日期列格式正确
先将DATE列转换为pandas的datetime类型,避免后续处理出错:
df['DATE'] = pd.to_datetime(df['DATE'])
2. 生成自定义分组键
定义函数为每个日期分配对应的分组起始日期(即每组的开始标识,如2024-01-26、2024-02-26等):
def get_group_start(date): if date.day >= 26: # 26号及以后的日期,归属当月26日起始的分组 return date.replace(day=26) else: # 25号及以前的日期,归属上月26日起始的分组 return (date - pd.DateOffset(months=1)).replace(day=26) # 生成分组列 df['group_start'] = df['DATE'].apply(get_group_start)
3. 按分组键聚合数据
直接通过生成的group_start列分组求和,结果索引即为每组的起始日期,对应范围是该日期到次月25日:
grouped_result = df.groupby('group_start')[['POB']].sum()
动态生成自定义日期范围列表
如果需要批量生成2024-X1-26到2024-X2-25格式的日期范围,可使用以下代码:
# 起始基准日期 start_base = pd.to_datetime('2024-01-26') # 要生成的范围数量 num_ranges = 6 date_range_list = [] for i in range(num_ranges): start_date = start_base + pd.DateOffset(months=i) # 结束日期为下一个月26号减1天,即次月25号 end_date = start_base + pd.DateOffset(months=i+1) - pd.DateOffset(days=1) date_range_list.append( (start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d')) ) # 输出格式化后的日期范围 for start, end in date_range_list: print(f"start_date = '{start}'") print(f"end_date = '{end}'")
运行后会输出:
start_date = '2024-01-26' end_date = '2024-02-25' start_date = '2024-02-26' end_date = '2024-03-25' ...
内容的提问来源于stack exchange,提问作者remanas
相关产品推荐
相关产品推荐

