如何实现交替日期列与中间值列的数据向量化堆叠?
电表消耗数据格式化与向量化堆叠方案
首先,我把你提供的原始记录整理成结构化的Markdown表格,方便清晰查看每个字段的对应关系:
| INSTALL | METER_NO | Field3 | Field4 | Field5 | Field6 | Field7 | Field8 | Field9 | Field10 | Field11 | Field12 | Field13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 80000000 | 19151882 | 1-Jan-18 | 5.6 | 1-Dec-17 | 7.9 | 1-Nov-17 | 5.5 | 1-Oct-17 | 4.4 | 1-Sep-17 | 6.1 | 1-Aug-17 |
| 80000001 | 31692087 | 1-Jan-18 | 55.5 | 1-Dec-17 | 62.7 | 1-Nov-17 | 2.2 | 1-Oct-17 | 2 | 1-Sep-17 | 9.3 | 1-Aug-17 |
| 80000003 | MISSING | 1-Jan-18 | 0 | 1-Dec-17 | 0 | 1-Nov-17 | 0 | 1... | - | - | - | - |
日期与消耗的对应关系(按你的规则)
按照你说明的“消耗值位于两个日期列之间”的规则,每个记录的区间对应关系如下:
- 对于INSTALL
80000000:- 1-Aug-17(Field13)→ 1-Sep-17(Field11),消耗量:6.1(Field12)
- 1-Sep-17(Field11)→ 1-Oct-17(Field9),消耗量:4.4(Field10)
- 1-Oct-17(Field9)→ 1-Nov-17(Field7),消耗量:5.5(Field8)
- 1-Nov-17(Field7)→ 1-Dec-17(Field5),消耗量:7.9(Field6)
- 1-Dec-17(Field5)→ 1-Jan-18(Field3),消耗量:5.6(Field4)
- 对于INSTALL
80000001:- 1-Aug-17(Field13)→ 1-Sep-17(Field11),消耗量:9.3(Field12)
- 1-Sep-17(Field11)→ 1-Oct-17(Field9),消耗量:2(Field10)
- 1-Oct-17(Field9)→ 1-Nov-17(Field7),消耗量:2.2(Field8)
- 1-Nov-17(Field7)→ 1-Dec-17(Field5),消耗量:62.7(Field6)
- 1-Dec-17(Field5)→ 1-Jan-18(Field3),消耗量:55.5(Field4)
向量化堆叠处理实现(Python Pandas)
要完成这类结构化数据的向量化堆叠,最便捷的方式是用Pandas的melt思想(或手动分组拼接),将宽格式数据转换为长格式,实现堆叠效果。以下是具体代码:
import pandas as pd # 构造原始数据 data = { 'INSTALL': ['80000000', '80000001', '80000003'], 'METER_NO': ['19151882', '31692087', 'MISSING'], 'Field3': ['1-Jan-18', '1-Jan-18', '1-Jan-18'], 'Field4': [5.6, 55.5, 0], 'Field5': ['1-Dec-17', '1-Dec-17', '1-Dec-17'], 'Field6': [7.9, 62.7, 0], 'Field7': ['1-Nov-17', '1-Nov-17', '1-Nov-17'], 'Field8': [5.5, 2.2, 0], 'Field9': ['1-Oct-17', '1-Oct-17', '1...'], 'Field10': [4.4, 2, None], 'Field11': ['1-Sep-17', '1-Sep-17', None], 'Field12': [6.1, 9.3, None], 'Field13': ['1-Aug-17', '1-Aug-17', None] } df = pd.DataFrame(data) # 定义日期-消耗的配对组,对应每个区间的开始/结束日期+消耗字段 date_consumption_pairs = [ ('Field13', 'Field11', 'Field12'), ('Field11', 'Field9', 'Field10'), ('Field9', 'Field7', 'Field8'), ('Field7', 'Field5', 'Field6'), ('Field5', 'Field3', 'Field4') ] # 初始化空列表存储堆叠后的数据 stacked_data = [] # 遍历每个配对组,生成统一格式的子数据集 for start_col, end_col, consumption_col in date_consumption_pairs: temp_df = df[['INSTALL', 'METER_NO', start_col, end_col, consumption_col]].rename( columns={ start_col: 'Start_Date', end_col: 'End_Date', consumption_col: 'Consumption' } ) stacked_data.append(temp_df) # 合并所有堆叠数据,生成最终长格式数据集 final_stacked_df = pd.concat(stacked_data, ignore_index=True) # 可选:过滤掉缺失关键数据的行(根据需求调整) final_stacked_df = final_stacked_df.dropna(subset=['Start_Date', 'End_Date', 'Consumption']) print(final_stacked_df.head())
代码说明:
- 先构造原始DataFrame还原你的记录;
- 提前定义好每个日期区间和对应消耗字段的配对关系;
- 遍历每个配对组,将每组字段重命名为统一的
Start_Date、End_Date、Consumption,保证格式一致; - 合并所有分组数据,得到堆叠后的长格式数据集;
- 可选过滤缺失值,保证数据完整性。
运行后会得到类似如下的堆叠结果(示例):
| INSTALL | METER_NO | Start_Date | End_Date | Consumption |
|---|---|---|---|---|
| 80000000 | 19151882 | 1-Aug-17 | 1-Sep-17 | 6.1 |
| 80000001 | 31692087 | 1-Aug-17 | 1-Sep-17 | 9.3 |
| 80000000 | 19151882 | 1-Sep-17 | 1-Oct-17 | 4.4 |
| 80000001 | 31692087 | 1-Sep-17 | 1-Oct-17 | 2 |
这种长格式数据更适合后续的数据分析、可视化或建模操作,完全实现了向量化堆叠的需求。
内容的提问来源于stack exchange,提问作者Floydian
相关产品推荐
相关产品推荐

