如何基于星期、小时、分钟条件合并两个DataFrame并匹配avgSms
解决方案:基于时间维度匹配合并两个DataFrame
这是个非常典型的按时间粒度匹配数据的需求,用Pandas可以轻松实现,我给你一步步拆解操作:
1. 先明确数据结构(假设示例)
假设你的两个DataFrame结构如下:
- 第一个(平均短信量表
df_avg):包含weekday(1=周日,2=周一…)、hour、minute、avgSms四列 - 第二个(原始短信数据
df_sms):包含timestamp(时间戳)、sms(短信量)两列
2. 处理原始数据,提取匹配维度
首先要从df_sms的时间戳里提取出和df_avg对应的星期几、小时、分钟三个字段,重点是星期几的转换要符合你的规则(1=周日):
import pandas as pd # 先确保timestamp是datetime类型(如果还不是的话) df_sms['timestamp'] = pd.to_datetime(df_sms['timestamp']) # 提取小时和分钟 df_sms['hour'] = df_sms['timestamp'].dt.hour df_sms['minute'] = df_sms['timestamp'].dt.minute # 转换星期几:Pandas默认dt.dayofweek是0=周一,6=周日,对应你的规则1=周日、2=周一…7=周六 weekday_mapping = {6:1, 0:2, 1:3, 2:4, 3:5, 4:6, 5:7} df_sms['weekday'] = df_sms['timestamp'].dt.dayofweek.map(weekday_mapping)
3. 合并两个DataFrame
用merge方法,以weekday、hour、minute为匹配键,做左连接(保留原始短信数据的所有行,即使没有对应的平均值也会显示NaN):
# 合并数据,左连接确保df_sms的所有行都保留 result_df = pd.merge(df_sms, df_avg, on=['weekday', 'hour', 'minute'], how='left') # 可以按需删除中间生成的匹配字段(如果不需要的话) result_df = result_df.drop(['weekday', 'hour', 'minute'], axis=1)
关键注意点
- 如果
df_avg里的时间维度(比如分钟)是按区间统计的(比如每15分钟),那你需要先把df_sms的分钟也做对应分组(比如df_sms['minute'] = df_sms['timestamp'].dt.minute //15 *15),再做匹配 - 确保两个DataFrame的匹配字段类型一致(比如都是整数类型),避免因类型不匹配导致合并失败
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

