我能用write.csv在R中写入xts对象吗?

13

我有一个xts对象,第一列是日期时间,其后是开高低收四个价格数据。当我输入

>test

它按如下正确的方式打印输出:

2010-09-08 15:13:00   115   115  110    115
2010-09-08 15:14:00   120   125  115    125

然而,当我尝试使用write.csv(test, "test.csv")时,它只写入了OHLC数据,为什么会这样呢?我该使用什么命令来同时写入日期和时间?

这是test对象的str()方法的输出:

An ‘xts’ object from 2010-06-30 15:47:00 to 2010-09-08 15:14:00 containing:
  Data: num [1:21757, 1:4] 215 220 205 195 185 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "y.Open" "y.High" "y.Low" "y.Close"
  Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
  xts Attributes:  
 NULL
3个回答

24

可以的,而最简单的方式可能是通过 write.zoo

R> write.zoo
function (x, file = "", index.name = "Index", row.names = FALSE, 
    col.names = NULL, ...) 
{
    if (is.null(col.names)) 
        col.names <- !is.null(colnames(x))
    dx <- as.data.frame(x)
    stopifnot(all(names(dx) != index.name))
    dx[[index.name]] <- index(x)
    dx <- dx[, c(ncol(dx), 1:(ncol(dx) - 1))]
    write.table(dx, file = file, row.names = row.names, col.names = col.names, 
        ...)
}
<environment: namespace:zoo>
R> 

这里是一个完整的示例代码:

R> mat <- matrix(rnorm(20),5,4, dimnames=list(NULL, LETTERS[1:4]))
R> mat
              A          B         C         D
[1,] -2.5304768  0.5454043  0.754670  0.330617
[2,] -0.5199045  0.3943289 -1.271524 -2.243113
[3,] -0.0996277 -0.0513063 -0.846310 -0.140727
[4,]  0.3819981  0.5230709  1.131108  2.398311
[5,]  1.4366976 -1.7750772  0.193936  1.047754
R> xmat <- xts(mat, order.by=Sys.Date() + seq(-4,0))
R> xmat
                    A          B         C         D
2012-01-19 -2.5304768  0.5454043  0.754670  0.330617
2012-01-20 -0.5199045  0.3943289 -1.271524 -2.243113
2012-01-21 -0.0996277 -0.0513063 -0.846310 -0.140727
2012-01-22  0.3819981  0.5230709  1.131108  2.398311
2012-01-23  1.4366976 -1.7750772  0.193936  1.047754

现在我们已经有了数据,只需要把它写出来就可以了:

R> write.zoo(xmat, file="/tmp/demo.csv", sep=",")
R> system("cat /tmp/demo.csv")
"Index","A","B","C","D"
2012-01-19,-2.53047680387774,0.545404313269755,0.754669841541681,0.330616876246245
2012-01-20,-0.519904544868541,0.394328857686792,-1.27152367237311,-2.24311276135881
2012-01-21,-0.0996276931028331,-0.0513062656752562,-0.846309564748021,-0.14072731914499
2012-01-22,0.381998053276389,0.523070920853495,1.13110826400249,2.39831100812159
2012-01-23,1.43669757366164,-1.77507724264279,0.193935657150967,1.04775355172344
R> 

2012年1月25日修改 使用row.names=FALSE而不是TRUE来防止重复的行名。由于row.names=FALSE是默认设置,因此从调用中删除它。


Dirk,我已经尝试了几个小时,想知道如何在我的 .csv 文件中删除重复的日期列,但是目前还没有成功。此外,当我运行 > xmat[,1] A 2012-01-21 -1.4232098 2012-01-22 0.1456240 2012-01-23 -0.6625430 2012-01-24 -0.3947322 2012-01-25 0.5433947时,它会再次返回日期,而我只想得到 A 中的值。这可能吗? - user1155299
抱歉,我们想要 row.names=FALSE 这是默认设置。我已经相应地编辑了我的帖子。 - Dirk Eddelbuettel

12
在你的write.csv调用中,最简单的方法是先转换为数据框。
write.csv(as.data.frame(test),"test.csv")

完成后你就可以结束了。

如果你在Excel中打开它,现在你应该已经将日期/时间索引放在A列,OHLC对象放在B到E列。


0

为什么不直接使用saveSymbols()函数呢?

根据@Dirk Eddelbuettel在他的回答中提供的矩阵,可以这样做。

xmat <- xts(mat, order.by=Sys.Date() + seq(-4,0))
saveSymbols(xmat, file.path="/tmp/xmat.csv")

1
saveSymbols保存的是二进制的.RData文件,而不是csv文件。 - GSee
2
我应该删除我的回答还是保留它但标记为不正确?我想保留它,这样其他人就可以从我的愚蠢中学习。 - Gabriel Fair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接