基于Pandas识别同病房不同患者的时间重叠区间
识别同一病房下的患者共享时段
核心需求
从数据集中识别**同一病房(assigned_pat_loc相同)**下,**不同患者(patient_id不同)**的住院时间重叠时段,生成双向记录(每对共享患者各存一条),包含患者ID、共享对象ID、共享时段起止时间、共享时长(小时)、病房位置。
实现步骤(基于Pandas)
1. 数据预处理
先确保时间列转为datetime类型,方便后续时间计算:
import pandas as pd # 假设清理后的数据集已读入为df df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time'])
2. 按病房分组,识别重叠时段
对每个病房的患者数据,两两比对时间区间,提取有效重叠部分并生成双向记录:
# 存储结果的空列表 result = [] # 按病房分组遍历 for loc, group in df.groupby('assigned_pat_loc'): group = group.reset_index(drop=True) n = len(group) # 遍历所有不同患者对 for i in range(n): for j in range(i+1, n): pat1 = group.iloc[i] pat2 = group.iloc[j] # 计算重叠时段的起止时间 overlap_start = max(pat1['start_time'], pat2['start_time']) overlap_end = min(pat1['end_time'], pat2['end_time']) # 仅保留有效重叠(结束时间晚于开始时间) if overlap_end > overlap_start: # 计算共享时长(转成小时) length = (overlap_end - overlap_start).total_seconds() / 3600 # 生成患者1的记录 result.append({ 'id': pat1['patient_id'], 'r_id': pat2['patient_id'], 'start_date': overlap_start.date(), 'start_time': overlap_start.time(), 'end_date': overlap_end.date(), 'end_time': overlap_end.time(), 'length': round(length, 2), 'location': loc }) # 生成患者2的记录(双向存储) result.append({ 'id': pat2['patient_id'], 'r_id': pat1['patient_id'], 'start_date': overlap_start.date(), 'start_time': overlap_start.time(), 'end_date': overlap_end.date(), 'end_time': overlap_end.time(), 'length': round(length, 2), 'location': loc }) # 转换为结果DataFrame result_df = pd.DataFrame(result)
3. 针对原始事件数据的前置处理(补充)
如果你的原始数据是包含Admission/Transfer/Discharge事件的格式(如你提供的补充示例),需要先将其转换为患者-病房-时间区间的清理后格式:
- 对每个患者按时间排序事件
- 提取每个病房对应的入住(Admission/Transfer进入)和离开(Transfer离开/Discharge/Death)时间,生成每个患者在每个病房的
start_time和end_time,再执行上述代码。
输出示例
运行后结果格式与你期望的一致,例如:
id r_id start_date start_time end_date end_time length location 0 1 2 2011-06-01 01:00:00 2011-06-01 08:00:00 7.0 8w^201 1 2 1 2011-06-01 01:00:00 2011-06-01 08:00:00 7.0 8w^201 2 1 3 2011-06-01 09:00:00 2011-06-05 09:00:00 96.0 8w^201 3 3 1 2011-06-01 09:00:00 2011-06-05 09:00:00 96.0 8w^201 4 2 4 2011-05-31 07:00:00 2011-06-01 01:00:00 18.0 10E^45 5 4 2 2011-05-31 07:00:00 2011-06-01 01:00:00 18.0 10E^45
内容的提问来源于stack exchange,提问作者hulio_entredas
相关产品推荐
相关产品推荐

