Python中如何将单日平均值与当日所有数值关联对比
问题根因
触发Length of values does not match length of index报错的直接原因是:存储日平均心率的DataFrame行数等于统计的天数,而实时心率监测的DataFrame行数等于所有时间节点的监测记录总数,二者长度不一致,直接把日均心率列赋值给实时心率表必然触发长度不匹配错误。
要实现单日平均值关联到当日所有时刻的数值,不需要手写循环做跨日期匹配,用pandas自带的关联逻辑即可快速实现。
具体实现步骤
首先统一两张表的关联键(日期字段)格式,避免因为日期格式不一致导致匹配失败:
import pandas as pd # 假设实时心率表名为df_realtime,包含字段:监测时间monitor_time、实时心率heart_rate # 假设日均心率表名为df_daily_avg,包含字段:日期date、日均心率daily_avg_hr # 把实时表的时间列转为标准datetime格式,提取纯日期作为关联键 df_realtime['monitor_time'] = pd.to_datetime(df_realtime['monitor_time']) df_realtime['date'] = df_realtime['monitor_time'].dt.date # 把日均表的日期列转为和实时表一致的日期格式 df_daily_avg['date'] = pd.to_datetime(df_daily_avg['date']).dt.date
方法1:map映射(推荐,速度最快)
适合日均表每个日期仅对应唯一一条平均心率记录的场景,生成的新列和原实时表长度完全一致,不会触发长度报错:
# 构建「日期-日均心率」的映射字典 avg_hr_map = df_daily_avg.set_index('date')['daily_avg_hr'].to_dict() # 按日期匹配,给每一条实时记录挂上对应日期的平均心率 df_realtime['daily_avg_hr'] = df_realtime['date'].map(avg_hr_map)
方法2:merge左连接
适合后续需要关联更多日维度统计数据(比如日步数、日睡眠时长等)的场景:
df_realtime = df_realtime.merge( df_daily_avg[['date', 'daily_avg_hr']], on='date', how='left' )
后续对比计算
匹配完成后直接做差值计算即可得到每个时刻心率和当日均值的对比结果:
# 计算实时心率与当日均值的差值,正值表示高于当日均值,负值表示低于当日均值 df_realtime['hr_diff_with_daily_avg'] = df_realtime['heart_rate'] - df_realtime['daily_avg_hr']
注意:如果匹配后出现日均心率列为空的情况,先检查两张表的日期格式是否完全一致,是否存在某一天没有日均统计值的情况。
内容的提问来源于stack exchange,提问作者moos
相关产品推荐
相关产品推荐

