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

Posted

技术标签:

【中文标题】如何将 data.frame 表转换为 xts 对象【英文标题】:How to convert a data.frame table to an xts object 【发布时间】:2020-03-07 05:53:42 【问题描述】:

我从 Thomson Reuters Datastream 将价格数据下载到 excel 中并创建了一个 csv 文件。生成的 csv 文件是一个 data.frame 对象。我已经使用as.date 函数将日期列设置为date。结果表是一个有 42 列的 data.frame,第一列是 date 列,其他 41 列是不同公司的价格数据。价格数据的类别为'numeric'。 该表如下所示:

       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 函数,它将价格表转换为收益表,如下所示:

      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 类型。简而言之,我认为如果我可以将表格转换为 xts 对象,我的问题就可以解决。有人知道桌子的问题可能是什么吗?我很感激每一个提示,有一个好的:)

【问题讨论】:

您是否检查过date &lt;- as.Date(test$Date, format = "%m/%d/%Y") 中的日期转换实际上为您提供了非NA 日期?只需执行summary(date) 即可查看是否有任何 NA。也许您的格式字符串不正确?例如,会不会是 %Y-%m-%d? 谢谢,根据 R,那里有 134 个 NA。然而,当我浏览桌子时,我找不到任何东西。日期的格式字符串似乎是正确的,在 excel 和原始 csv 文件中,日期看起来像 2000 年 1 月 3 日。而应用 as.Date 函数后,是 2000-01-03。 检查test$date。 2000 年 1 月 3 日是模棱两可的 - 它也可能是 2000 年 3 月 1 日,所以也许您的格式字符串应该是 %d/%m/%Y?可能值得将 test$date 中的字符串值与您的 csv 文件进行比较。 【参考方案1】:

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

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")

【讨论】:

非常感谢,#2 为我工作。数据现在是“xts”“zoo”格式。然而不幸的是,价格现在也是“xts”“动物园”,Return.calculate 无法计算任何东西。 如果数据采用注释中假定的格式,两者都应该工作。我已经修改了假定的格式。第一个显然更紧凑。 再次,非常感谢您的帮助,非常感谢您的时间:)。我发现在 excel 文件中观察到的某些价格超过了 1000 美元。意外的格式是这样的:$1,145.32,这促使 R 在此列中使用因子。在我将格式更改为 1145.32 美元后,它与 #1 和 #2 完美配合。祝你好运;)

以上是关于如何将 data.frame 表转换为 xts 对象的主要内容,如果未能解决你的问题,请参考以下文章

从 tibble 转换为 xts 后更改数据类型

如何将数据框转换为xts

如何将data.frame列从因子转换为数字[重复]

为啥我的数字变量有日期以及如何将整个内容转换为 xts?

使用 RODBC 将 SQL 存储过程结果转换为 data.frame 格式

如何将Excel中的导入文件转换为R studio中的xts文件