如何将XTS转换为data.frame并保留索引?

38

我有一个 R 中的 XTS 时间序列,格式如下,我想在导出为 CSV 并在另一个程序中使用之前进行一些处理、子集和重新排列。

head(master_1)
                   S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650

and

:并且
str(master_1)
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing:
  Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "S_1"
  Indexed by objects of class: [POSIXt,POSIXct] TZ: 
  Original class: 'zoo'  
  xts Attributes:  
List of 1
 $ dateFormat: chr "Date"

我希望将其转换为数据框以便更轻松地操作,并将其导出到另一个程序。但是,当我使用test1 <- as.data.frame(master_1)时,test1上确实显示了索引(即日期和时间)。

head(test1)
                       S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650 

但是索引没有显示,

str(test1)
'data.frame': 4000 obs. of  1 variable:
 $ S_1: num  2.85 2.69 2.57 2.38 2.22 ...

使用 write.csv(master_1, file="master_1.csv") 写入 csv 文件时,不包含时间或日期。为什么会这样,我该如何将日期/时间数据作为一列包括在内,以便在其他 R 命令中使用并正确导出?

感谢任何帮助。

6个回答

63

那是因为你的数据框中日期是行名。你需要将它们变成一个单独的列。

尝试这样:

 data.frame(date=index(master_1), coredata(master_1))

4
没问题。回答第二个问题:write.csv 不包括索引,因为索引是 xts 的一个 属性,而不是行名。请使用 write.zoo 代替。 - Joshua Ulrich
感谢Shane和Joshua,这帮助我看到了我一直以来的错误。 - phrozenpenguin
data.frame(date=index(master_1), value=coredata(master_1)[,]) 可以一次性重命名变量。 - PatrickT
谢谢,这对我有用。library('magrittr'); master_1 %>% data.frame %>% data.frame(Date = rownames(.), .) 有时候有效,有时候无效。 - Rγσ ξηg Lιαη Ημ 雷欧

20

这是一个侧边栏,但是ggplot2 包中的 fortify(...) 函数将各种对象转换为适用于在 ggplot(...) 中使用的数据框,包括 xts 对象。

library(xts)
set.seed(1)    # for reproducible example
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9))

library(ggplot2)
df <- fortify(master_1)
head(df)
#                  Index master_1
# 1  2010-03-03 00:00:00 1.937355
# 2  2010-03-03 00:00:30 2.018364
# 3  2010-03-03 00:01:00 1.916437
# 4  2010-03-03 00:01:30 2.159528
# 5  2010-03-03 00:02:00 2.032951
# 6  2010-03-03 00:02:30 1.917953

所以,如果你已经在使用ggplot,那么这是一个简单的方法。请注意,索引进入名为Index(大写的"I")的列中。


感谢您的回答,我成功地在ggplot2中绘制了xts。http://stackoverflow.com/questions/35215579/how-to-plot-xts-in-ggplot2 - shiny

8
自从版本1.9.6起,您可以直接将xts进行转换而不会丢失索引类。操作非常简单:
as.data.table(master_1)

索引被添加为结果data.table中的第一列,它保留了索引DatePOSIXct类。


1
需要使用 data.table - xm1

5

您可以使用zoo::fortify.zoo()将xts对象转换为包含索引的数据框,该列名为“Index”。

您不需要ggplot2,但如果已经加载了xts(或zoo)和ggplot2,则仍将起作用。

例如:

library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix, dateFormat = "Date")
my_df <- fortify.zoo(x)
head(my_df)
#        Index     Open     High      Low    Close
# 1 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 3 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 4 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 5 2007-01-06 50.24433 50.24433 50.11121 50.18112
# 6 2007-01-07 50.13211 50.21561 49.99185 49.99185
str(my_df)
# 'data.frame': 180 obs. of  5 variables:
#  $ Index: Date, format: "2007-01-02" "2007-01-03" ...
#  $ Open : num  50 50.2 50.4 50.4 50.2 ...
#  $ High : num  50.1 50.4 50.4 50.4 50.2 ...
#  $ Low  : num  50 50.2 50.3 50.2 50.1 ...
#  $ Close: num  50.1 50.4 50.3 50.3 50.2 ...

2

Shane是正确的。你可能正在寻找index(your xts)。这里有一个可重现的例子。

library(xts)
example(xts)
x = head(sample.xts)
datefield = index(x)
newdf = data.frame(x,datefield)

然后您应该能够将其简单地导出为csv格式。当然,您也可以重命名行。


感谢ran2提供的示例。如果x不是XTS对象,我也可以使用rownames(x)。 - phrozenpenguin

-2
一个优雅的表单将XTS转换为data.frame:
myDF <- as.data.frame(as.matrix(myXTS))

不需要使用 as.matrix,并且这也没有回答问题:“使用 write.csv(master_1, file="master_1.csv") 写入 csv 文件时不包含时间或日期信息。为什么会这样,如何将日期/时间数据作为一列包含进去,以便在其他 R 命令中使用并正确导出?” - GSee

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