You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:57:25