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
相关产品推荐
相关产品推荐

