将数据框转换为xts格式

57
我将尝试使用as.xts()方法将数据框转换为xts对象。这是我的输入数据框q:
q
                      t x  
1  2006-01-01 00:00:00  1  
2  2006-01-01 01:00:00  2  
3  2006-01-01 02:00:00  3

str(q)
    'data.frame':   10 obs. of  2 variables:
 $ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ...  
 $ x: int  1 2 3 4 5 6 7 8 9 10

结果如下:
> as.xts(q)
Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

这是我能想到的最简单的例子,所以无法让它正常工作让人感到相当沮丧... 感激任何帮助!


你需要将时间/日期变量转换为数据框的行名,然后 as.xts 就可以工作了。tibble:column_to_rownames("timevar") 函数可以帮助你完成这个任务。 - Simon Woodward
11个回答

83

这是明确记录的---xtszoo对象由提供了两个参数来形成,即携带数据的向量矩阵DatePOSIXctchron等类型提供时间信息(或在zoo情况下提供排序)。

因此,像这样做:

 qxts <- xts(q[,-1], order.by=q[,1])

然后你就可以完成设置了。


3
谢谢!你帮了我很多,虽然答案很简单!(对我来说不是很明显,因为我以前没有使用过时间序列包,并且从文档中也没有理解到)。但还是非常感谢! - user442446
27
考虑到“xts:可扩展时间序列”论文明确指出可以从data.frame进行转换,我认为这并不是那么显而易见的。 - frankc
14
把我加入认为这并不是很“清楚记录”的人之列吧。但由于这个答案,我成功地弄清了与原问题无关的另一件事情。 - atomicules
4
@DamienB(以及其他评论者和点赞者),我们非常乐意接受使文档更清晰/不那么迷惑的贡献/补丁。 开源软件的好处在于:您可以通过行动产生影响(仅仅发表意见而不采取行动是没有用的)。 - Joshua Ulrich
4
@DamienB: 我 "@" 你是因为你最近,而在评论中只能 "@" 一个人(这很烦人)。我很乐意与贡献者合作,帮助他们真正理解,但我不能接受他们对需要澄清的内容的看法。然而,诚实的尝试,即使不完美,也会受到极大的赞赏(例如,请参阅由一个SO问题提问者编写的R-Forge上的xts FAQ)。 - Joshua Ulrich
显示剩余6条评论

21

好的,as.xts默认假设日期存储在data.frame的rownames中。因此会出现错误消息。一种快速而简单的解决方法是:

rownames(q) = q[1]
as.xts(q)

但是你会得到一个带有日期字符串的额外列。理想情况下,最好一开始就使用日期作为数据框的行名来构建。


3
可能应该这样写:rownames(q) = q[[1]],意思是将q的第一个元素作为行名。 - IRTFM
@42,有什么区别吗? - Ahmadov
2
@Ahmedov q[1]将是包含向量的列表。 q[[1]]只是矢量。如果[<-.rownames接受列表,则可能没有区别,但即使它这样做,也不是所有类特定的赋值函数都会这样做。 - IRTFM
你可以使用tibble::column_to_rownames在管道中设置行名。 - Simon Woodward

9
这里有一个使用 tidyquant 包的解决方案,它包含一个名为 as_xts() 的函数,可以将数据框转换为 xts 对象。它还包括 as_tibble() 函数,可以将 xts 对象转换为 tibble("tidy" 数据框)。
重新创建数据框(请注意,“tidy” 数据框中使用日期时间类,但任何无歧义的日期或日期时间类都可以使用):
> q
# A tibble: 3 × 2
                    t     x
               <dttm> <dbl>
1 2006-01-01 00:00:00     1
2 2006-01-01 01:00:00     2
3 2006-01-01 02:00:00     3

使用as_xts()将数据转换为“xts”类。指定参数date_col = t,将“t”列指定为要用作行名称的日期:
> library(tidyquant)
> as_xts(q, date_col = t)
                    x
2006-01-01 00:00:00 1
2006-01-01 01:00:00 2
2006-01-01 02:00:00 3

返回的是一个 xts 对象,其行名称包括正确的日期或日期时间。

9
此功能已弃用,请使用timetk :: tk_xts代替。 https://www.rdocumentation.org/packages/tidyquant/versions/0.5.3/topics/as_xts - psychonomics

3
以下是一种可能的解决方案:
library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)

1
你好,欢迎来到Stack Overflow。当回答一个已经有几个答案的问题时,请确保添加一些额外的见解,说明你提供的回答是实质性的,而不仅仅是重复原始发布者已经审核过的内容。这在“仅代码”答案中尤为重要,比如你提供的那个答案。 - chb

0
原因似乎很清楚,xts不接受tibbles,即使选择了列也仍然存储为Tibbles。要么将核心数据转换为矩阵或向量。以下代码有效: xls.tbl <- xls(tbl$x, order.by = tbl$t)

0

我也遇到了这个问题,但我的日期格式略有不同:yyyy-mm-dd,与OP不同,这是您从R下载的财务数据的典型格式。
具体来说,例如:"2022-02-28"。
因此,所有建议的解决方案都无法使用。
有效的方法是:

as.xts(q, order.by=as.Date(rownames(q), format = "%Y%m%d"))

假设您的数据在典型的数据帧中,日期作为行名称(如果不是,请适当替换q和数据和日期列)


0

对于 tibble 或者 data.frame:

就像 @psychonomics 的评论中所述,可以使用 tk_xts

library(timetk)

qxts <- tk_xts(q)

对于 data.table

as.xts(dt)tk_xts(dt)data.table dt 上快得多。

因此,这里的一个简单解决方案是先将 data.frame 转换为 data.table

library(data.table)

qxts <- as.xts(as.data.table(q))

0
您可以简单地执行以下操作。
qxts <- xts(q[,2],q$t)

对我有用。


0
我定义了一个索引,其长度等于我的 tibble 的行数。只有在像示例中显示的那样分别定义时间序列之后才能实现此操作:
ti= seq(from = ymd_hm("2000-01-01 00:00"),
to = ymd_hm("2000-01-02 01:00"), by =  "30 min", tz = "UTC")

tbl <- tibble(t =ti,
    x = 1:length(t))
)

这段代码可用:

xts.tbl <- xts(tbl[,-1], order.by = ti)

然而所有数据都转换为字符。


0

请尝试以下操作

q$t<-as.xts(q, order.by = as.Date(q$t), dateFormat="POSIXct")

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