如何将数据框转换为xts

Posted

技术标签:

【中文标题】如何将数据框转换为xts【英文标题】:How to convert data frame to xts 【发布时间】:2022-01-07 23:37:36 【问题描述】:

我有一个包含日期和数据的大型数据框。在每个奇数列中,我都有日期,每隔一列有相应的股票价格。我想将每个列对转换为一个单独的 xts 对象。数据框如下所示:

...1        Stock Price
2021-11-09    72.5
2021-11-10    73.4
2021-11-15    72.9
etc           etc

当我调用以下行时,它工作正常: xts(df[,2],order.by=df$...1) 但是我想在循环中使用它,所以我宁愿使用 xts(df[,2],order.by=df[,1]), 但这会导致错误。 order.by 需要一个适当的基于时间的对象。 当我尝试这个时:xts(df[,2],order.by=as.Date(df[,1])) 会弹出不知道如何将“x”转换为“日期”类。我不明白,因为最初的第一列是 posixct 格式。 有人可以建议我一个解决方案吗? 谢谢

【问题讨论】:

您的最后一行代码应该可以工作,除非 df[, 1] 不是 Posixct 列。先检查一下。否则,将您的一些数据添加到问题中。大量使用dput(your_df[10, 1:6])。此代码将输出 data.frame 的前 10 行和 6 列,您可以将其复制粘贴到您的问题中。 dput(al[10,1:4]) structure(list(...1 = structure(790214400, tzone = "UTC", class= c("POSIXct", "POSIXt") ), BF/B UN Equity = 1.7299, ...3 = 结构(790214400, tzone = "UTC", class= c("POSIXct", "POSIXt")), UN UN Equity = 4.3911), row.names = c( NA, -1L), class= c("tbl_df", "tbl", "data.frame")) 是的 df[,1] 是 Posixct 列 【参考方案1】:

lapply 中,您可以将 0 和 2 添加到索引中,以循环遍历这两个初始数据。给出两个时间序列的列表。

lapply(c(0, 2), \(i) xts::xts(df[, 2 + i], order.by=df[, 1 + i]))
# [[1]]
# [,1]
# 1995-01-16 1.7299
# 1995-01-16 1.7299
# 1995-01-16 1.7299
# 
# [[2]]
# [,1]
# 1995-01-16 4.3911
# 1995-01-16 4.3911
# 1995-01-16 4.3911

数据

df <- structure(list(...1 = structure(c(790214400, 790214400, 790214400
), tzone = "UTC", class = c("POSIXct", "POSIXt")), `BF/B UN Equity` = c(1.7299, 
1.7299, 1.7299), ...3 = structure(c(790214400, 790214400, 790214400
), tzone = "UTC", class = c("POSIXct", "POSIXt")), `UN UN Equity` = c(4.3911, 
4.3911, 4.3911)), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

以上是关于如何将数据框转换为xts的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将年度数据转换为季度数据?

我尝试导入外部外汇数据,但无法将其转换为 xts 对象

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

将 XTS 对象作为数据帧存储在 R 的列表中

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