如何将 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 <- 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 对象的主要内容,如果未能解决你的问题,请参考以下文章