You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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:当前患者ID
  • r_id:共享病房的另一患者ID
  • room:共享的病房标识
  • overlap_start:重叠区间的开始时间
  • overlap_end:重叠区间的结束时间
  • length:共享时长(单位:小时)

内容的提问来源于stack exchange,提问作者hulio_entredas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:20:33