Pandas如何按日期空窗条件对同演出同剧院百老汇数据分组
基于空窗间隔的独立演出分段聚合实现方法
核心逻辑
传统按演出名+剧院分组的方式,会把同场地多年复排的同名演出错误合并。解决思路是在「演出名+剧院」的分组基础上,进一步识别组内的时间断档,把超过一周无记录的区间拆成独立的演出段,完全适配业务规则:连续周度记录不管跨不跨年都归为同一演出、断档超一周就拆分。
具体实现步骤
- 预处理数据格式:将周结束日期字段从字符串转换为pandas可计算的日期类型,全表按「演出名、剧院、周结束日期」排序,保证同演出同剧院的记录按时间先后排列
- 生成独立演出段标识:按「演出名、剧院」分组,组内计算相邻记录的日期间隔,标记出所有超过7天的空窗位置,将空窗位置做累加计数,得到每个连续演出段的唯一编号
- 执行聚合:基于「演出名、剧院、段编号」三个维度做分组,计算gross的均值
可直接运行的示例代码
import pandas as pd # 加载示例数据集 df = pd.DataFrame({ "Show": ["Mamma Mia", "Mamma Mia", "Mamma Mia", "Shrek The Musical", "Mamma Mia", "Mamma Mia", "Mamma Mia", "Mamma Mia", "Mamma Mia"], "Week_ending": ["05/01/2020", "12/01/2020", "19/01/2020", "19/01/2020", "11/08/2019", "18/08/2019", "27/12/2009", "03/10/2010", "10/01/2010"], "Theatre": ["T1", "T1", "T1", "T2", "T3", "T3", "T1", "T1", "T1"], "gross": [100, 200, 150, 100, 100, 100, 100, 100, 100] }) # 转换日期格式,适配数据集的日/月/年格式避免解析错误 df['Week_ending'] = pd.to_datetime(df['Week_ending'], format='%d/%m/%Y') # 排序保证组内时间顺序正确 df = df.sort_values(['Show', 'Theatre', 'Week_ending']).reset_index(drop=True) # 为每个连续演出段生成唯一编号 def get_segment_id(group): # 计算相邻记录的日期间隔 date_gap = group['Week_ending'].diff() # 间隔超过7天即判定为出现断档,需要拆分 has_new_segment = date_gap > pd.Timedelta(weeks=1) # 累加断档标记得到段编号 return has_new_segment.cumsum() df['segment_id'] = df.groupby(['Show', 'Theatre'], group_keys=False).apply(get_segment_id) # 分组聚合计算单段演出的平均gross agg_result = df.groupby(['Show', 'Theatre', 'segment_id'])['gross'].mean().reset_index(name='mean_gross') # (可选)给演出名标注首发年份,匹配期望的展示效果 agg_result['show_label'] = agg_result.apply( lambda row: f"{row['Show']} ({df[(df['Show']==row['Show']) & (df['Theatre']==row['Theatre']) & (df['segment_id']==row['segment_id'])]['Week_ending'].dt.year.iloc[0]})", axis=1 )
适配性说明
- 不会拆分连续跨年演出:如果演出从11月持续到次年3月,全程相邻周记录间隔均为7天,会被完整归为同一分组,不会像按年份拆分的方式一样把连续演出切为两段
- 自动识别断档拆分:同一演出同一剧院下只要出现超过一周的无数据空窗,就会自动拆分为独立分组,可正确将T1剧院下相隔十年的不同版本《妈妈咪呀》拆为独立组
内容的提问来源于stack exchange,提问作者Conj28
相关产品推荐
相关产品推荐

