如何在Pandas DataFrame中判断住院时段与用药时段是否存在重叠
判断住院时段与用药时段是否重叠的解决方案
嘿,我来帮你搞定这个问题!你需要新增一个布尔列来标记患者住院期间是否接受过药物治疗,核心就是判断住院时段和用药时段是否存在任何时间重叠——哪怕只有1秒也算数。
核心判断逻辑
两个时间区间[A_start, A_end]和[B_start, B_end]存在重叠的关键条件是:
A_start < B_end 且 B_start < A_end
这个逻辑能覆盖所有重叠场景:不管是一个时段完全包含另一个,还是两个时段部分交叉,只要满足这个条件就说明有重叠。同时我们还要处理NaT的情况——如果没有用药记录(start_med或end_med为NaT),直接标记为False即可。
代码实现
直接用pandas的布尔掩码就能搞定,代码如下:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({'admission_timestamp': ['2021-01-17 17:45:00', '2020-03-31 23:32:00', '2020-03-27 18:20:00', '2020-04-17 18:12:00', '2020-03-19 19:12:00'], 'end_period': ['2021-01-18 17:45:00', '2020-04-01 23:32:00', '2020-03-28 18:20:00', '2020-04-18 18:12:00', '2020-03-20 19:12:00'], 'start_med': ['NaT', '2020-04-01 00:00:00', '2020-03-27 19:00:00', '2020-04-17 18:39:24', 'NaT'], 'end_med': ['NaT', '2020-04-14 21:00:00', '2020-04-05 00:00:00', '2020-05-06 22:07:29', 'NaT']}) # 确保所有时间列是datetime类型(如果还没转换的话) df[['admission_timestamp', 'end_period', 'start_med', 'end_med']] = df[['admission_timestamp', 'end_period', 'start_med', 'end_med']].apply(pd.to_datetime) # 1. 筛选出有有效用药记录的行(排除NaT的情况) has_valid_med = ~df['start_med'].isna() & ~df['end_med'].isna() # 2. 判断住院时段和用药时段是否重叠 is_overlap = (df['admission_timestamp'] < df['end_med']) & (df['start_med'] < df['end_period']) # 3. 合并条件,得到最终的布尔列 df['received_medidation'] = has_valid_med & is_overlap
运行结果
执行后你的DataFrame会新增目标列,结果如下:
| admission_timestamp | end_period | start_med | end_med | received_medidation |
|---|---|---|---|---|
| 2021-01-17 17:45:00 | 2021-01-18 17:45:00 | NaT | NaT | False |
| 2020-03-31 23:32:00 | 2020-04-01 23:32:00 | 2020-04-01 00:00:00 | 2020-04-14 21:00:00 | True |
| 2020-03-27 18:20:00 | 2020-03-28 18:20:00 | 2020-03-27 19:00:00 | 2020-04-05 00:00:00 | True |
| 2020-04-17 18:12:00 | 2020-04-18 18:12:00 | 2020-04-17 18:39:24 | 2020-05-06 22:07:29 | True |
| 2020-03-19 19:12:00 | 2020-03-20 19:12:00 | NaT | NaT | False |
逻辑验证
- 第2行:住院时段到4月1日23:32,用药从4月1日00:00开始,两个时段有重叠,标记为
True - 第3行:住院时段到3月28日18:20,用药从3月27日19:00开始,明显重叠,标记为
True - 第4行:用药从住院当天18:39开始,在住院时段内,标记为
True - 第1、5行:无用药记录,标记为
False
内容的提问来源于stack exchange,提问作者sandertjuh
相关产品推荐
相关产品推荐

