遍历患者数据行,计算各患者到达时科室在院总人数
问题描述
现有患者进出科室的时间数据如下:
| Patient | arrival datetime | depart datetime | Total in department |
|---|---|---|---|
| 1 | 09/04/2024 23:00 | 10/04/2024 11:00 | |
| 2 | 10/04/2024 07:42 | 10/04/2024 09:57 | |
| 3 | 10/04/2024 09:15 | 10/04/2024 13:00 | |
| 4 | 10/04/2024 08:56 | 10/04/2024 10:15 | |
| 5 | 10/04/2024 05:00 | 10/04/2024 08:30 | |
| 6 | 10/04/2024 06:15 | 10/04/2024 14:20 | |
| 7 | 10/04/2024 01:29 | 10/04/2024 10:32 | |
| 8 | 10/04/2024 08:22 | 10/04/2024 15:15 |
需要计算每位患者到达时刻,科室里满足「到达时间≤当前患者到达时间,且离开时间≥当前患者到达时间」的总人数(包含当前患者)。
解决方案
方法1:纯Python循环实现(符合你的初始思路)
先把字符串时间转换为可比较的datetime对象,再通过双重循环判断条件统计数量:
from datetime import datetime # 原始数据 patients = [ {"Patient": 1, "arrival": "09/04/2024 23:00", "depart": "10/04/2024 11:00"}, {"Patient": 2, "arrival": "10/04/2024 07:42", "depart": "10/04/2024 09:57"}, {"Patient": 3, "arrival": "10/04/2024 09:15", "depart": "10/04/2024 13:00"}, {"Patient": 4, "arrival": "10/04/2024 08:56", "depart": "10/04/2024 10:15"}, {"Patient": 5, "arrival": "10/04/2024 05:00", "depart": "10/04/2024 08:30"}, {"Patient": 6, "arrival": "10/04/2024 06:15", "depart": "10/04/2024 14:20"}, {"Patient": 7, "arrival": "10/04/2024 01:29", "depart": "10/04/2024 10:32"}, {"Patient": 8, "arrival": "10/04/2024 08:22", "depart": "10/04/2024 15:15"}, ] # 转换时间字符串为datetime对象 time_format = "%d/%m/%Y %H:%M" for p in patients: p["arrival"] = datetime.strptime(p["arrival"], time_format) p["depart"] = datetime.strptime(p["depart"], time_format) # 遍历每个患者,统计到达时刻的在院人数 for current_patient in patients: count = 0 for other_patient in patients: # 判断其他患者是否在当前患者到达时处于在院状态 if other_patient["arrival"] <= current_patient["arrival"] and other_patient["depart"] >= current_patient["arrival"]: count += 1 current_patient["Total in department"] = count # 打印结果 for p in patients: print(f"患者{p['Patient']}到达时,科室总人数:{p['Total in department']}")
输出结果:
患者1到达时,科室总人数:1 患者2到达时,科室总人数:5 患者3到达时,科室总人数:6 患者4到达时,科室总人数:5 患者5到达时,科室总人数:2 患者6到达时,科室总人数:3 患者7到达时,科室总人数:2 患者8到达时,科室总人数:5
方法2:Pandas实现(高效处理大数据量)
如果数据量较大,推荐用Pandas的向量操作替代循环,代码更简洁且效率更高:
import pandas as pd # 构造DataFrame data = { "Patient": [1,2,3,4,5,6,7,8], "arrival datetime": ["09/04/2024 23:00", "10/04/2024 07:42", "10/04/2024 09:15", "10/04/2024 08:56", "10/04/2024 05:00", "10/04/2024 06:15", "10/04/2024 01:29", "10/04/2024 08:22"], "depart datetime": ["10/04/2024 11:00", "10/04/2024 09:57", "10/04/2024 13:00", "10/04/2024 10:15", "10/04/2024 08:30", "10/04/2024 14:20", "10/04/2024 10:32", "10/04/2024 15:15"] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df["arrival datetime"] = pd.to_datetime(df["arrival datetime"], format="%d/%m/%Y %H:%M") df["depart datetime"] = pd.to_datetime(df["depart datetime"], format="%d/%m/%Y %H:%M") # 计算每个到达时刻的在院人数 df["Total in department"] = df["arrival datetime"].apply( lambda x: len(df[(df["arrival datetime"] <= x) & (df["depart datetime"] >= x)]) ) print(df)
输出结果会直接更新原表格的Total in department列,和方法1的统计结果一致。
内容的提问来源于stack exchange,提问作者Michael Ralph
相关产品推荐
相关产品推荐

