You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R从彭博(Bloomberg)导入历史价格时重复date列问题求解

问题原因

你调用bdh()接口传入多只标的时,返回结果是嵌套列表结构,每个标的对应一个子列表,自带date和价格列,直接转换为数据框会把所有子列表的列依次拼接,就会出现多列重复date的问题。

调整后实现代码

提供两种实现方案,按需选择即可:

方案1:tidyverse生态简洁实现(代码可读性高)

# 安装依赖包(仅首次运行需要)
install.packages(c("Rblpapi", "tidyverse", "writexl"))

# 加载包
library(Rblpapi)
library(tidyverse)
library(writexl)

# 连接彭博终端
blpConnect()

# 配置标的和取数字段
tickers <- c("SPX INDEX","BXIIE3MC Index")
myField <- "PX_LAST"

# 拉取原始数据
raw_data <- bdh(
  tickers,
  myField,
  start.date = as.Date("2019-12-31"),
  include.non.trading.days = TRUE
)

# 数据清洗:仅保留1个日期列,其余列对应标的价格
Benchmark <- raw_data %>%
  # 重命名价格列为对应标的代码
  imap(~rename(.x, !! .y := all_of(myField))) %>%
  # 按日期列合并所有标的数据
  reduce(left_join, by = "date")

# 导出到Excel
write_xlsx(Benchmark, "彭博历史价格数据.xlsx")

方案2:纯base R实现(无需额外加载tidyverse包)

# 安装依赖包(仅首次运行需要)
install.packages(c("Rblpapi", "writexl"))

# 加载包
library(Rblpapi)
library(writexl)

# 连接彭博终端
blpConnect()

# 配置标的和取数字段
tickers <- c("SPX INDEX","BXIIE3MC Index")
myField <- "PX_LAST"

# 拉取原始数据
raw_data <- bdh(
  tickers,
  myField,
  start.date = as.Date("2019-12-31"),
  include.non.trading.days = TRUE
)

# 数据清洗:仅保留1个日期列,其余列对应标的价格
Benchmark <- raw_data[[1]]
colnames(Benchmark) <- c("date", names(raw_data)[1])
for (i in 2:length(raw_data)) {
  temp <- raw_data[[i]]
  colnames(temp) <- c("date", names(raw_data)[i])
  Benchmark <- merge(Benchmark, temp, by = "date", all.x = TRUE)
}

# 导出到Excel
write_xlsx(Benchmark, "彭博历史价格数据.xlsx")
效果说明

处理后得到的Benchmark第一列为统一的日期字段,后续每一列对应一个标的的PX_LAST历史价格,没有重复日期列,可直接写入Excel使用。

内容的提问来源于stack exchange,提问作者TaibaCo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 06:27:03