R语言data frame重构:IESO发电机组出力数据格式转换
R实现IESO机组出力数据集宽转长重构方案
问题背景
分析加拿大安大略省独立电力系统运营商(Independent Electricity System Operator, IESO)公开的Generator Output-Capability Month Report数据集,该数据记录了安大略省各主力发电机组的发电能力与实际出力情况,分析目标为统计机组发电能力与实际出力的差值及其随时间的变化规律。
原始数据为宽表格式,无法直接适配分析需求,以下是完整可复现的DataFrame重排重构方案。
基础规则说明
数据获取渠道
- 可通过IESO官方报告页面下载完整原始数据集
PUB_GenOutputCapabilityMonth_202001.csv - 也可使用简化样例数据开展测试,样例仅包含前2台机组、5个代表性小时的观测值,样例数据的R代码如下:
JanuaryData = data.frame(`Delivery Date`= c('2020-01-01', '2020-01-01', '2020-01-01', '2020-01-01', '2020-01-01'), `Generator` = c('ABKENORA', 'ABKENORA', 'ADELAIDE', 'ADELAIDE', 'ADELAIDE'), `Fuel Type` = c('Hydro', 'Hydro', 'Wind', 'Wind', 'Wind'), `Measurement` = c('Capability', 'Output', 'Available Capacity', 'Forecast', 'Output'), `Hour 1` = c('13', '13', '60', '28', '1'), `Hour 7` = c('13', '13', '60', '32', '0'), `Hour 13` = c('13', '13', '60', '26', '25'), `Hour 18` = c('13', '13', '60', '39', '43'), `Hour 24` = c('13', '13', '60', '57', '57') ) View(JanuaryData)
原始数据结构
固定列为Delivery Date(交付日期)、Generator(机组名称)、Fuel Type(燃料类型)、Measurement(指标类型),后续为Hour 1至Hour 24共24个小时维度的数值列;其中风电类机组Measurement下的Available Capacity指标,与其他类型机组的Capability指标含义完全等价。
目标数据结构要求
转换为长表格式,最终字段为Delivery Date、Generator、Fuel Type、Hour(小时编号)、Capability(发电能力,合并风电的Available Capacity与其他机组的Capability)、Output(实际出力)、Forecast(预测出力);每一行对应单台机组单小时的全部指标,无对应观测的字段填充n/a。
具体实现方案(基于tidyverse生态)
方案全程使用tidyverse工具链实现,代码可读性强,适配全量月度数据无性能问题
实现逻辑
- 先统一指标命名:把风电机组的
Available Capacity重命名为Capability,对齐不同燃料类型的发电能力字段 - 宽表转长表:把所有
Hour X格式的列收拢为两列,分别存储小时编号、对应指标的数值 - 清洗小时字段:提取
Hour后的数字作为纯数值型的小时编号,方便后续按时间排序、计算 - 指标展开为独立列:把长表中Measurement存储的三类指标(Capability/Output/Forecast)转为独立字段,缺失值按要求填充为
n/a - 可选排序:按机组名称、小时编号排序,方便人工校验结果
完整可运行代码
# 加载依赖,未安装的话先运行 install.packages("tidyverse") library(tidyverse) cleaned_data <- JanuaryData %>% # 第一步:对齐不同燃料类型的发电能力指标名称 mutate(Measurement = case_when( `Fuel Type` == "Wind" & Measurement == "Available Capacity" ~ "Capability", TRUE ~ Measurement )) %>% # 第二步:宽转长,收拢所有小时维度列 pivot_longer( cols = starts_with("Hour "), names_to = "Hour", values_to = "value" ) %>% # 第三步:提取纯数字格式的小时编号 mutate(Hour = as.numeric(str_remove(Hour, "Hour "))) %>% # 第四步:将指标展开为独立列,缺失值填充n/a pivot_wider( id_cols = c(`Delivery Date`, Generator, `Fuel Type`, Hour), names_from = Measurement, values_from = value, values_fill = "n/a" ) %>% # 按机组、小时排序,方便查看校验 arrange(Generator, Hour) # 查看转换结果 View(cleaned_data)
结果校验说明
样例数据运行后将输出7列共10行结果(2台机组*5个观测小时):
- 水电机组ABKENORA无预测出力数据,Forecast字段自动填充
n/a,Capability、Output值和原始数据完全一致 - 风电机组ADELAIDE的原Available Capacity值全部归入Capability列,Output、Forecast值和原始数据逐小时对齐,无错位问题
全量数据处理注意事项
- 处理完整月度csv时,先用
read_csv("PUB_GenOutputCapabilityMonth_202001.csv")读取原始数据,再传入上述处理流程即可,无需修改其他代码 - 如果后续需要计算发电能力与实际出力的差值,可在填充
n/a前先完成数值计算,避免字符串格式的n/a导致运算报错。
内容的提问来源于stack exchange,提问作者Howie25247
相关产品推荐
相关产品推荐

