如何实现基于时间区间求和的复杂Pandas DataFrame合并?
基于节目时间区间统计对应半小时观众总数
我们需要将df1中的节目信息,与df2中对应节目、且半小时区间处于节目官方起止时间内的观众数据求和合并,最终得到目标result_df的效果。
原始数据
import pandas as pd df1 = pd.DataFrame({'Show':['NBA Basketball','NHL Hockey'],'Start_Time':['19:00','15:00'],'End_Time':['20:00','15:30']}) df2 = pd.DataFrame({'Show':['NBA Basketball','NBA Basketball','NBA Basketball','NBA Basketball','NBA_Basketball','NHL Hockey','NHL Hockey','NHL Hockey'],'Half_Hour_Interval_Start':['19:00','19:30','20:00','20:30','21:00','15:00','15:30','16:00'],'Viewers':[1000,2000,1500,1000,3000,2000,4000,5000]})
解决方案步骤
1. 转换时间格式为可比较数值
将时间字符串转为分钟数(小时×60+分钟),简化区间判断逻辑:
def time_to_minutes(time_str): hours, minutes = map(int, time_str.split(':')) return hours * 60 + minutes # 给df1添加转换后的时间列 df1['Start_Min'] = df1['Start_Time'].apply(time_to_minutes) df1['End_Min'] = df1['End_Time'].apply(time_to_minutes) # 给df2添加转换后的区间开始时间列 df2['Interval_Start_Min'] = df2['Half_Hour_Interval_Start'].apply(time_to_minutes)
2. 合并并筛选符合条件的记录
按节目名称合并两个DataFrame,筛选出半小时区间开始时间在节目起止范围内的记录(注意:区间开始时间需小于节目结束时间,因为结束时间点不属于播出时段):
# 合并df1和df2 merged = pd.merge(df1, df2, on='Show', how='left') # 筛选时间符合条件的记录 filtered = merged[(merged['Interval_Start_Min'] >= merged['Start_Min']) & (merged['Interval_Start_Min'] < merged['End_Min'])]
3. 分组求和并整理结果
按节目分组求和观众数,再合并回原df1并整理成目标格式:
# 按节目分组求和观众数 viewers_sum = filtered.groupby('Show')['Viewers'].sum().reset_index() # 合并回df1并保留目标列 result_df = pd.merge(df1, viewers_sum, on='Show', how='left') result_df = result_df[['Show', 'Start_Time', 'End_Time', 'Viewers']]
验证结果
此时result_df的输出与目标完全一致:
print(result_df) # 输出: # Show Start_Time End_Time Viewers # 0 NBA Basketball 19:00 20:00 3000 # 1 NHL Hockey 15:00 15:30 2000
补充说明
df2中的NBA_Basketball(下划线命名)与df1的NBA Basketball(空格命名)名称不匹配,因此不会被统计,符合目标结果要求。- 用分钟数转换时间的方式,避免了datetime类型的时区等额外问题,更适合单纯的时段比较场景。
内容的提问来源于stack exchange,提问作者AI92
相关产品推荐
相关产品推荐

