如何用R下载CAISO的PCR_LMP数据:压缩XML转DataFrame及获取CSV
以下是用R处理CAISO PCR_LMP数据的两种可行方案:
一、下载压缩XML文件并转换为DataFrame
你可以自动完成从下载ZIP包、解压到解析XML为DataFrame的全流程,无需手动操作文件:
- 加载所需包
需要用到httr处理下载、xml2解析XML、dplyr和tidyr整理数据:
library(httr) library(xml2) library(dplyr) library(tidyr)
- 下载并解压ZIP包
以你提供的其中一个XML压缩链接为例,先下载到临时文件,再解压提取XML:
# 定义ZIP链接 zip_url <- "http://oasis.caiso.com/oasisapi/SingleZip?queryname=PRC_INTVL_LMP&startdatetime=20220919T07:00-0000&enddatetime=20220919T08:00-0000&version=3&market_run_id=RTM&grp_type=ALL_APNODES" # 下载ZIP到临时文件 temp_zip <- tempfile(fileext = ".zip") GET(zip_url, write_disk(temp_zip, overwrite = TRUE)) # 解压并获取XML文件名 xml_files <- unzip(temp_zip, list = TRUE)$Name xml_file_path <- unzip(temp_zip, files = xml_files[grepl("\\.xml$", xml_files)], exdir = tempdir())
- 解析XML为DataFrame
提取XML中的PRC_INTVL_LMP节点,将属性和文本内容转换为结构化数据:
# 读取XML文档 xml_doc <- read_xml(xml_file_path) # 提取所有LMP数据节点 lmp_nodes <- xml_find_all(xml_doc, "//PRC_INTVL_LMP") # 转换为DataFrame lmp_df <- lmp_nodes %>% map_dfr(~{ # 提取节点属性 attrs <- xml_attrs(.x) %>% as.data.frame() %>% t() %>% as.data.frame(stringsAsFactors = FALSE) # 提取子节点文本(如LMP值、节点名称等) values <- xml_children(.x) %>% set_names(xml_name(.)) %>% map_chr(xml_text) %>% as.data.frame() %>% t() %>% as.data.frame(stringsAsFactors = FALSE) # 合并属性和值 bind_cols(attrs, values) }) # 查看结果 head(lmp_df)
二、通过API直接获取CSV文件并加载为DataFrame
CAISO OASIS API支持直接返回CSV格式,只需在请求URL中添加resultformat=6参数(该参数值对应CSV输出),同时确保其他参数符合要求:
- 构造正确的CSV请求URL
以你提供的节点查询为例,添加resultformat=6后,URL如下:
csv_url <- "http://oasis.caiso.com/oasisapi/SingleZip?queryname=PRC_INTVL_LMP&startdatetime=20220919T00:00-0000&enddatetime=20220919T08:00-0000&version=3&market_run_id=RTM&node=LAPLMG1_7_B2&resultformat=6"
注意:时间格式需严格遵循
YYYYMMDDTHH:MM±HHMM,时区偏移要正确;market_run_id(如RTM、DAM)需与数据类型匹配;若查询多个节点,可用node参数多次拼接(如node=NODE1&node=NODE2)。
- 下载并加载CSV为DataFrame
直接读取CSV内容,无需保存到本地:
# 直接从API读取CSV csv_df <- read.csv(csv_url, stringsAsFactors = FALSE) # 查看结果 head(csv_df)
如果API返回的是ZIP压缩的CSV(部分情况下会自动压缩),可先下载解压再读取:
temp_csv_zip <- tempfile(fileext = ".zip") GET(csv_url, write_disk(temp_csv_zip, overwrite = TRUE)) csv_files <- unzip(temp_csv_zip, list = TRUE)$Name csv_file_path <- unzip(temp_csv_zip, files = csv_files[grepl("\\.csv$", csv_files)], exdir = tempdir()) csv_df <- read.csv(csv_file_path, stringsAsFactors = FALSE)
常见问题提示
- 若API请求失败,检查参数是否完整:
queryname、startdatetime、enddatetime、version为必填参数,market_run_id、node/grp_type需根据查询需求选择。 - 时间范围不宜过大,否则API可能返回超时或数据量过大的错误,建议分批次查询。
- 若XML解析出现乱码,可在
read_xml中指定编码:read_xml(xml_file_path, encoding = "UTF-8")
内容的提问来源于stack exchange,提问作者user2946746
相关产品推荐
相关产品推荐

