基于Pandas识别同一病房不同患者的时间重叠区间
解决方案步骤
1. 数据预处理与时间整合
首先需要合并日期和时间为完整的 datetime 字段,去除冗余记录,并按患者ID和时间排序,为后续生成停留区间做准备。
import pandas as pd # 读取原始数据 data = pd.read_csv('raw_data.csv') # 提取病房标识(去掉床位部分,保留「unit^room」格式) data['room'] = data['assigned_pat_loc'].str.extract(r'([^^]+\^[^^]+)') # 合并日期与时间为完整的 datetime 字段 data['datetime'] = pd.to_datetime(data['Date'] + ' ' + data['Time']) # 移除同一患者同一时间的重复记录 data = data.drop_duplicates(subset=['id', 'datetime'], keep='first') # 按患者ID和时间排序 data = data.sort_values(by=['id', 'datetime']).reset_index(drop=True)
2. 生成患者病房停留区间
为每个患者生成在各病房的具体停留时间段:停留开始时间为进入病房的时间,结束时间为离开该病房的时间(下一次转房/出院的时间)。
patient_stays = [] # 按患者分组处理 for patient_id, group in data.groupby('id'): group_len = len(group) for idx in range(group_len): current_row = group.iloc[idx] room = current_row['room'] start_time = current_row['datetime'] # 确定停留结束时间:最后一条记录(出院)用当前时间,否则用下一条记录的时间 if idx == group_len - 1: end_time = start_time else: end_time = group.iloc[idx+1]['datetime'] # 仅保留有效停留记录(排除无效/null的房间信息) if pd.notna(room): patient_stays.append({ 'id': patient_id, 'room': room, 'start_time': start_time, 'end_time': end_time }) # 转换为DataFrame格式 stays_df = pd.DataFrame(patient_stays)
3. 计算同一病房的患者时间重叠区间
针对每个病房,将不同患者的停留区间进行配对,计算重叠时长并生成目标格式结果。
final_result = [] # 按病房分组处理 for room, room_group in stays_df.groupby('room'): intervals = room_group.to_dict('records') interval_count = len(intervals) # 遍历所有两两配对的区间(排除同一患者的配对) for i in range(interval_count): for j in range(i+1, interval_count): stay_a = intervals[i] stay_b = intervals[j] if stay_a['id'] == stay_b['id']: continue # 计算重叠区间的起止时间 overlap_start = max(stay_a['start_time'], stay_b['start_time']) overlap_end = min(stay_a['end_time'], stay_b['end_time']) # 仅保留有效重叠(开始时间早于结束时间) if overlap_start < overlap_end: # 计算重叠时长(转换为小时,保留两位小数) overlap_hours = round((overlap_end - overlap_start).total_seconds() / 3600, 2) # 为两位患者分别生成记录 final_result.append({ 'id': stay_a['id'], 'r_id': stay_b['id'], 'room': room, 'overlap_start': overlap_start, 'overlap_end': overlap_end, 'length': overlap_hours }) final_result.append({ 'id': stay_b['id'], 'r_id': stay_a['id'], 'room': room, 'overlap_start': overlap_start, 'overlap_end': overlap_end, 'length': overlap_hours }) # 转换为最终结果DataFrame result_df = pd.DataFrame(final_result)
结果字段说明
最终的result_df包含以下核心字段:
id:当前患者IDr_id:共享病房的另一患者IDroom:共享的病房标识overlap_start:重叠区间的开始时间overlap_end:重叠区间的结束时间length:共享时长(单位:小时)
内容的提问来源于stack exchange,提问作者hulio_entredas
相关产品推荐
相关产品推荐

