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

Python:基于索引事件将用药时间间隔数据划分为两日区间块

用药数据转换:围绕索引事件的两日区间块重塑

原始数据

首先定义输入数据:

import pandas as pd

df = pd.DataFrame({
    'id': [1,1,1,1,2,2,2,2],
    'date_medication': ['2000-01-01','2000-01-02','2000-01-05','2000-01-06','2000-01-01','2000-01-03','2000-01-06','2000-01-10'],
    'medication': ['A','A','B','B','A','B','A','B'],
    'index_date': ['2000-01-04','2000-01-04','2000-01-04','2000-01-04','2000-01-05','2000-01-05','2000-01-05','2000-01-05']
})

需求说明

需要将数据转换为以**索引事件(IE)**为中心的两日区间块:

  • 每个区间用对应的天数偏移中心值作为列名(如-4代表[-5,-3]区间,-2代表[-3,-1]区间,0代表索引事件所在的[-1,1]区间,以此类推)
  • 区间内有用药记录则填充对应药物名称,无记录则填0
  • 索引事件所在的0列统一标记为IE

目标输出格式示例:

id -4 -2 0  2  4  6 
1  A  A  IE B  0  0
2  A  B  IE A  A  B

实现代码

以下是基于Pandas的完整实现:

# 转换日期列为datetime类型
df['date_medication'] = pd.to_datetime(df['date_medication'])
df['index_date'] = pd.to_datetime(df['index_date'])

# 计算用药日期与索引日期的天数差
df['days_offset'] = (df['date_medication'] - df['index_date']).dt.days

# 将天数差映射到两日区间的中心值(每2天一个块,中心为偶数)
def map_to_interval(day):
    return (day // 2) * 2

df['interval'] = df['days_offset'].apply(map_to_interval)

# 按id和区间分组,保留每个区间的第一条用药记录
interval_df = df.groupby(['id', 'interval'])['medication'].first().reset_index()

# 确定需要包含的所有区间(覆盖现有数据+IE所在的0区间)
all_intervals = sorted(set(interval_df['interval'].tolist() + [0]))

# 透视转换为宽格式,填充缺失值为0,标记IE
result = interval_df.pivot(index='id', columns='interval', values='medication').reindex(columns=all_intervals)
result = result.fillna('0')
result[0] = 'IE'

# 调整列名格式并重置索引
result = result.reset_index()
result.columns = ['id'] + [str(col) for col in all_intervals]

# 打印结果
print(result)

输出结果

运行代码后得到:

id  -4  -2   0  2  4  6
0   1   A   A  IE  B  0  0
1   2   A   B  IE  A  0  B

(注:示例中id2的4列标注为A,但原始数据中id2在索引日期+4天左右无用药记录,此处为示例笔误,代码逻辑基于实际数据计算)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:34