如何将XTS更改为data.frame并保留索引?

phr*_*uin 29 time r dataframe xts

我在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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

我想将其转换为data.frame,以便我可以更轻松地操作它,然后导出到另一个程序.但是,当我使用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 
Run Code Online (Sandbox Code Playgroud)

但索引没有显示,

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

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

谢谢你的帮助.

Sha*_*ane 50

那是因为日期是data.frame中的rownames.您需要将它们设为单独的列.

试试这个:

 data.frame(date=index(master_1), coredata(master_1))
Run Code Online (Sandbox Code Playgroud)

  • 这是对的。回答第二个问题:`write.csv`不包含索引,因为索引是xts * attribute *,而不是行名。使用`write.zoo`代替。 (2认同)

jlh*_*ard 13

这是一个侧边栏,但fortify(...)包中的函数ggplot2会将各种对象转换为适合使用的数据框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
Run Code Online (Sandbox Code Playgroud)

因此,如果您已经在使用它,gggplot这是一种简单的方法.请注意,索引进入名为Index(大写"I")的列.


jan*_*cki 5

因为1.9.6您可以直接从/转换xts而不会丢失索引类.很简单:

as.data.table(master_1)
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*ich 5

您可以将 xts 对象转换为 data.frame,其中包含索引作为名为“Index”的列,并带有zoo::fortify.zoo().

您不需要 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 ...
Run Code Online (Sandbox Code Playgroud)