QlikView:为指定ID补全缺失日期并填充前序日期数值
解决时间序列补全与前向填充问题
原始数据集
| 日期 | ID | 数值 |
|---|---|---|
| 2/4/17 | 3 | 4.4 |
| 2/4/17 | 9 | 6.2 |
| 2/9/17 | 3 | 4.7 |
| 2/9/17 | 4 | 7.4 |
| 2/9/17 | 9 | 9.4 |
| 2/11/17 | 3 | 9.7 |
| 2/11/17 | 7 | 12.4 |
需求说明
需要补全2/4/17到2/11/17之间的所有缺失日期,并且每个ID在无记录的日期里,填充其前一次有记录的数值,直到下一条该ID的记录出现。
实现方案(Python pandas)
这是处理这类时间序列填充最常用的工具,步骤清晰易操作:
- 导入依赖并加载数据
import pandas as pd # 加载原始数据 data = pd.DataFrame({ '日期': ['2/4/17', '2/4/17', '2/9/17', '2/9/17', '2/9/17', '2/11/17', '2/11/17'], 'ID': [3, 9, 3, 4, 9, 3, 7], '数值': [4.4, 6.2, 4.7, 7.4, 9.4, 9.7, 12.4] }) # 将日期列转为datetime格式,方便后续生成连续日期序列 data['日期'] = pd.to_datetime(data['日期'], format='%m/%d/%y')
- 构建完整的日期-ID组合
# 获取所有唯一ID unique_ids = data['ID'].unique() # 生成从最早到最晚日期的每日连续序列 full_dates = pd.date_range(start=data['日期'].min(), end=data['日期'].max(), freq='D') # 创建日期和ID的笛卡尔积,确保每个日期每个ID都有对应行 full_index = pd.MultiIndex.from_product([full_dates, unique_ids], names=['日期', 'ID']) # 将原始数据转为以日期和ID为索引的格式 data_indexed = data.set_index(['日期', 'ID'])
- 合并数据并填充缺失值
# 合并到完整索引上,缺失的数值会显示为NaN full_data = data_indexed.reindex(full_index).reset_index() # 按ID分组,用前向填充(ffill)延续上一次的数值 full_data['数值'] = full_data.groupby('ID')['数值'].ffill()
最终结果
处理后的数据集完全符合需求,截取部分展示:
| 日期 | ID | 数值 |
|---|---|---|
| 2017-02-04 | 3 | 4.4 |
| 2017-02-04 | 9 | 6.2 |
| 2017-02-05 | 3 | 4.4 |
| 2017-02-05 | 9 | 6.2 |
| 2017-02-06 | 3 | 4.4 |
| 2017-02-06 | 9 | 6.2 |
| 2017-02-07 | 3 | 4.4 |
| 2017-02-07 | 9 | 6.2 |
| 2017-02-08 | 3 | 4.4 |
| 2017-02-08 | 9 | 6.2 |
| 2017-02-09 | 3 | 4.7 |
| 2017-02-09 | 9 | 9.4 |
| 2017-02-09 | 4 | 7.4 |
| ... | ... | ... |
这个方法的核心是先构建全覆盖的日期-ID组合,再通过分组前向填充,确保每个ID的数值能准确延续到下一条记录出现前的所有日期。
内容的提问来源于stack exchange,提问作者war10ck
相关产品推荐
相关产品推荐

