如何将 data.frame table 转换为 xts 对象

How to convert a data.frame table to an xts object

我从 Thomson Reuters Datastream 下载价格数据到 excel 并创建了一个 csv 文件。生成的 csv 文件是一个 data.frame 对象。我已经使用 as.date 函数将日期列设置为 date。结果 table 是一个包含 42 列的 data.frame,第一列是 date 列,另外 41 列是不同公司的价格数据。价格数据的class为'numeric'。 table 看起来像这样:

       date           TickerA      TickerB      TickerC
    1  2000-01-03       20           NA            40
    2  2000-01-04       21           33            42
    3  2000-01-05       22           32            NA
    4  .
    5  .
    6  .

请注意,由于一些公司在观察期内破产或成立较晚,因此部分价格缺失。现在,我想使用 PerformanceAnalytics 包中的 Return.calculate 函数,它将价格的 table 转换为 returns 的 table,像这样:

      date           TickerA     TickerB     TickerC
   1  2000-01-03       NA          NA          NA
   2  2000-01-04      0.049        NA         0.049
   3  2000-01-05      0.047      -0.031        NA
   4   .
   5   .
   6   .

到目前为止的代码如下所示:

test <- read.csv("data.csv")
date <- as.Date(test$Date, format = "%m/%d/%Y")
data <- cbind(date, test[,-1]) 

当我尝试应用 Return.calculate 函数时,发生了这种情况:

returns <- Return.calculate(data, method = 'log')
'Error in checkData(prices, method = 'xts'): the data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'.'

当我尝试将 data 转换为 xts 对象时,显示如下:

xtsdata <- xts(data, order.by = data$date)
'Error in xts(data, order.by = data$date): 'order.by' cannot contain 'NA', 'NaN', or 'Inf'.' 

我不明白这一点,因为我的日期列是 date 类型,我的价格列是 numeric 类型。简而言之,我认为如果我可以将 table 转换为 xts 对象,我的问题就可以解决。有人知道 table 的问题是什么吗?我很感激每一个提示,有一个好的:)

假设您所拥有的与最后注释中的一样:

library(xts)

# 1
z <- read.csv.zoo("data.csv", format = "%m/%d/%Y")
x <- as.xts(z)

# 2    
DF <- read.csv("data.csv")
z <- read.zoo(DF, format = "%m/%d/%Y")
x <- as.xts(z)

# Calculate returns

library(PerformanceAnalytics)

Return.calculate(x, method = 'log')
##               TickerA     TickerB    TickerC
## 2000-01-03         NA          NA         NA
## 2000-01-04 0.04879016          NA 0.04879016
## 2000-01-05 0.04652002 -0.03077166         NA

备注

Lines <- "date,TickerA,TickerB,TickerC
01/03/2000,20,,40
01/04/2000,21,33,42
01/05/2000,22,32,
"
cat(Lines, file = "data.csv")