使用xts读取R中每日股票时序数据时遇错误求助
问题:使用xts读取每日股票市场数据时遭遇多类错误
数据集背景
数据集包含5030条观测值,时间范围覆盖2000年1月4日至2019年7月22日,是SystemicR包作者提供的data_stock_returns数据集,目标是复现作者结果后替换为自有数据集。
已做排查
- 确认数据集中无NA值
- 尝试将日期格式从
dd/mm/yyyy改为yyyy/mm/dd,未解决问题 - 转换为季度频率后可正常读取,推测每日数据读取代码存在问题
数据集示例
| Date | SXXP | STJ | ISP | INGA | Index |
|---|---|---|---|---|---|
| 4/01/2000 | 0 | 0 | -0.0209 | -0.0274 | 1 |
| 5/01/2000 | 0 | -0.02484 | -0.0020 | -0.00854 | 2 |
| 6/01/2000 | 0 | 0.0995 | -0.0212 | -0.00689 | 3 |
| 7/01/2000 | 0 | 0.061 | 0.02303 | 0.01961 | 4 |
| 10/01/2000 | -0.00147 | -0.0456 | -0.0172 | 0.00119 | 5 |
| ... | ... | ... | ... | ... | ... |
| 22/07/2019 | 0 | -0.0127 | 0.00124 | 0.0029756 | 5030 |
尝试的代码及错误
代码1:
df_my_data <- read.csv(('C:/Users/s/Desktop/R/intro/data/data_stock_returns.csv'), sep = ";") str(df_my_data) # 'data.frame': 5030 obs. of 74 variables: # $ Index : int 1 2 3 4 5 6 7 8 9 10 ... # $ SXXP : num 0 0 0 0 0 ... # $ STJ : num 0 -0.0248 0.0995 0.0611 -0.0456 ... # $ ISP : num -0.021 -0.0021 -0.0212 0.023 -0.0173 ... xts(df_my_data, order.by = as.Date(rownames(df_my_data$Date), "%d/%m/%Y")) df_my_data$Date <- as.Date(df_my_data$Date)
错误信息:
Error in
$<-.data.frame(*tmp*, Date, value = numeric(0)) : replacement has 0 rows, data has 5030
Error in xts(df_my_data, order.by = as.Date(rownames(df_my_data), "%d/%m/%Y")) :
'order.by' cannot contain 'NA', 'NaN', or 'Inf'
代码2:
df_my_data$Date_xts <- as.xts(df_my_data[, -1], order.by = (df_my_data$Date))
错误信息:
Error in xts(x, order.by = order.by, frequency = frequency, ...) :
order.by requires an appropriate time-based object
代码3:
library(SystemicR) l_result<- f_CoVaR_Delta_CoVaR_i_q(data_stock_returns)
解决方案
1. 正确读取并处理本地CSV文件
从str(df_my_data)输出可见,数据框中无Date列,说明读取CSV时未正确加载该列或列名解析错误。需确保读取时包含Date列,再正确转换日期格式:
# 读取CSV,确认Date列被加载 df_my_data <- read.csv("C:/Users/s/Desktop/R/intro/data/data_stock_returns.csv", sep = ";") # 转换日期格式(原格式为dd/mm/yyyy) df_my_data$Date <- as.Date(df_my_data$Date, format = "%d/%m/%Y") # 创建xts对象:用数值列作为数据,Date作为时间索引 xts_data <- xts(df_my_data[, -which(names(df_my_data) %in% c("Date", "Index"))], order.by = df_my_data$Date)
2. 直接使用SystemicR内置数据集
若目标是复现作者结果,无需手动读取CSV,直接加载包内数据集即可:
library(SystemicR) # 加载内置数据集 data("data_stock_returns") # 确认Date列格式并转换 data_stock_returns$Date <- as.Date(data_stock_returns$Date, format = "%d/%m/%Y") # 转为xts对象(若需要) xts_data <- xts(data_stock_returns[, -c("Date", "Index")], order.by = data_stock_returns$Date) # 运行作者提供的函数 l_result <- f_CoVaR_Delta_CoVaR_i_q(data_stock_returns)
错误原因解析
- 第一个错误:
df_my_data$Date不存在,直接赋值会生成长度为0的向量,无法匹配5030行数据 - 第二个错误:
rownames(df_my_data$Date)是错误用法,rownames()作用于数据框而非列,且原数据框行名不是日期字符串,转换后全为NA,导致xts的order.by参数不合法 - 第三个错误:
df_my_data$Date未被正确转换为时间对象(甚至不存在),不符合xts对order.by的类型要求
内容的提问来源于stack exchange,提问作者user17940819
相关产品推荐
相关产品推荐

