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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:39