基于Pandas实现血压测量匹配符合条件的最近心率数据
Pandas匹配最近符合时间条件的心率记录
需求
给定两个Pandas数据表:
df_hr:含时间(time)和心率(hr)列,存储心率测量数据df_bp:含时间(time)和收缩压(bp)列,存储血压测量数据
需为每条血压记录匹配早于该血压测量时间、且间隔不超过15分钟的最近一次心率数据。
用户尝试过truncate和iloc方法未成功,示例数据如下:
import pandas as pd import datetime df_hr = pd.DataFrame({'time': [datetime.datetime(2022,1,1,7,40), datetime.datetime(2022,1,1,9,50), datetime.datetime(2022,1,1,10,1)], 'hr': [60, 90, 100]}).set_index('time') df_bp = pd.DataFrame({'time': [datetime.datetime(2022,1,1,10), datetime.datetime(2022,1,1,8)], 'bp': [140, 120]}).set_index('time')
解决方案:使用merge_asof
Pandas的merge_asof方法专门用于按时间戳匹配最近的前序/后序记录,完美适配这个场景。步骤如下:
- 将两个表的时间索引转为列(方便合并操作),并按时间排序(
merge_asof要求输入表已排序) - 调用
merge_asof,设置时间匹配规则和15分钟的间隔限制
完整代码:
import pandas as pd import datetime # 示例数据 df_hr = pd.DataFrame({'time': [datetime.datetime(2022,1,1,7,40), datetime.datetime(2022,1,1,9,50), datetime.datetime(2022,1,1,10,1)], 'hr': [60, 90, 100]}).set_index('time') df_bp = pd.DataFrame({'time': [datetime.datetime(2022,1,1,10), datetime.datetime(2022,1,1,8)], 'bp': [140, 120]}).set_index('time') # 重置索引为列,并按时间排序 df_hr_sorted = df_hr.reset_index().sort_values('time') df_bp_sorted = df_bp.reset_index().sort_values('time') # 使用merge_asof匹配最近的符合条件的心率记录 result = pd.merge_asof( df_bp_sorted, df_hr_sorted, on='time', direction='backward', # 找早于/等于当前时间的最近记录 tolerance=pd.Timedelta(minutes=15) # 时间间隔不超过15分钟 ) # 可选:将time重新设为索引 result = result.set_index('time') print(result)
输出结果
bp hr time 2022-01-01 08:00:00 120 NaN 2022-01-01 10:00:00 140 90.0
代码解释
sort_values('time'):merge_asof要求左右表必须按匹配的时间列排序,否则无法正确找到最近记录direction='backward':指定匹配早于或等于血压时间的最近心率记录tolerance=pd.Timedelta(minutes=15):过滤掉时间间隔超过15分钟的记录,这类记录会显示为NaN- 示例中8:00的血压记录,最近的心率是7:40,间隔20分钟超过限制,因此无匹配结果;10:00的血压记录匹配到9:50的心率(间隔10分钟)
内容的提问来源于stack exchange,提问作者R.T.
相关产品推荐
相关产品推荐

