如何按固定2个月间隔统计每日案例数量?
解决按固定2个月间隔统计案例数的思路
步骤分解
要实现按1-2月、3-4月这种固定双月间隔统计,核心是给每个日期映射到对应的双月区间,再按ID+区间分组计数,具体步骤如下:
- 转换日期格式:将字符串类型的
date列转为pandas可处理的datetime类型 - 生成双月区间标签:通过计算把每个日期归入对应的双月组,生成如
2010-01_02的区间标识 - 分组统计:按
ID和双月区间分组,统计每组的案例数量
具体代码实现
import pandas as pd # 原始数据 d1 = pd.DataFrame({'ID': ["A", "A", "A", "B", "B", "C", "C", "C", "C", "D", "D", "D"], "date": ["2010-12-30", "2010-02-27", "2010-02-26", "2012-01-01", "2012-01-03", "2011-01-01", "2011-01-02", "2011-01-08", "2014-02-21", "2010-08-31", "2010-08-30", "2010-09-01"]}) # 1. 将date列转为datetime类型,方便日期计算 d1['date'] = pd.to_datetime(d1['date']) # 2. 生成双月区间标签 # 提取年份和月份 d1['year'] = d1['date'].dt.year d1['month'] = d1['date'].dt.month # 计算双月组:(month-1)//2 把1-2月归为0组,3-4月归为1组,...,11-12月归为5组 d1['bi_month_group'] = (d1['month'] - 1) // 2 # 根据组计算区间的起始/结束月份,补两位数字保证格式统一 d1['start_month'] = d1['bi_month_group'] * 2 + 1 d1['end_month'] = d1['bi_month_group'] * 2 + 2 # 拼接成目标格式的区间字符串 d1['bi_month'] = d1.apply(lambda row: f"{row['year']}-{row['start_month']:02d}_{row['end_month']:02d}", axis=1) # 3. 按ID和双月区间分组统计数量,整理成目标格式 result = d1.groupby(['ID', 'bi_month']).size().reset_index(name='count') result = result.rename(columns={'bi_month': 'date'}) print(result)
代码说明
- 日期转换:
pd.to_datetime()确保日期能被pandas正确识别和运算 - 双月组计算:
(month-1)//2是核心逻辑,通过整数除法将相邻两个月归为同一组 - 区间格式化:用
f-string补零格式化月份,保证区间字符串格式统一(如01而非1) - 分组统计:
groupby(['ID', 'bi_month']).size()直接统计每组案例数,reset_index()将结果转为标准DataFrame格式
运行结果
执行代码后输出与期望格式完全匹配:
ID date count 0 A 2010-01_02 2 1 A 2010-11_12 1 2 B 2012-01_02 2 3 C 2011-01_02 3 4 C 2014-01_02 1 5 D 2010-07_08 2 6 D 2010-09_10 1
内容的提问来源于stack exchange,提问作者krcoder
相关产品推荐
相关产品推荐

