如何在Pandas中匹配另一表前一小时区间的对应Volume事件数
实现方法
首先明确透视表df_aux的结构,假设它包含三列:Volume(与主表对应)、hour_interval(1小时区间的起始时间,比如2022-01-01 03:00:00代表03:00-04:00的区间)、event_count(该区间的事件数)。如果你的df_aux时间列存储的是区间结束时间,只需调整时间计算逻辑即可。
步骤1:统一时间类型
先确保两个表的时间列都是datetime类型:
# 转换主表Date列 df_main['Date'] = pd.to_datetime(df_main['Date']) # 转换透视表的时间列 df_aux['hour_interval'] = pd.to_datetime(df_aux['hour_interval'])
步骤2:计算主表每条记录对应的目标区间
对于df_main的每条Date,需要找到它前一小时所在的区间起始时间——比如2022-01-01 04:14:00对应的是03:00的起始区间,用floor('H')方法可直接把时间向下取整到最近的小时:
df_main['target_hour'] = df_main['Date'].dt.floor('H')
如果你的df_aux存储的是区间结束时间(比如03:00-04:00的区间存成2022-01-01 04:00:00),则改为:
df_main['target_hour'] = df_main['Date'].dt.floor('H') + pd.Timedelta(hours=1)
步骤3:匹配透视表的事件数
方法1:用merge关联(适合数据量中等的场景)
通过Volume和计算出的target_hour(对应df_aux的hour_interval)做左连接,保留主表所有记录:
# 整理透视表为映射表,重命名事件数列 df_aux_mapping = df_aux[['Volume', 'hour_interval', 'event_count']].rename(columns={'event_count': 'occurrences_1h_prev'}) # 关联主表 df_main = df_main.merge(df_aux_mapping, left_on=['Volume', 'target_hour'], right_on=['Volume', 'hour_interval'], how='left') # 删除临时列 df_main.drop(['target_hour', 'hour_interval'], axis=1, inplace=True)
若存在Volume+时间区间在df_aux中无记录的情况,occurrences_1h_prev会出现NaN,可补0处理:
df_main['occurrences_1h_prev'] = df_main['occurrences_1h_prev'].fillna(0)
方法2:用字典映射(适合大数据量场景,速度更快)
构建(Volume, hour_interval): event_count的映射字典,直接匹配主表记录:
# 构建映射字典 count_map = df_aux.set_index(['Volume', 'hour_interval'])['event_count'].to_dict() # 批量映射,无匹配则返回0 df_main['occurrences_1h_prev'] = df_main.apply( lambda row: count_map.get((row['Volume'], row['Date'].dt.floor('H')), 0), axis=1 )
内容的提问来源于stack exchange,提问作者datadatadata
相关产品推荐
相关产品推荐

