55

我正在尝试使用 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

这是我能想到的最简单的例子,所以没有让它工作是非常令人沮丧的......感谢任何帮助!

4

9 回答 9

83

这已明确记录 --- xtszoo对象是通过提供两个参数形成的,avectormatrix携带数据和Date, POSIXct, chron, ... 类型提供时间信息(或在zoo的情况下排序)。

所以做类似的事情

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

你应该被设置。

于 2010-11-28T14:52:28.747 回答
21

好吧,as.xts 默认假定日期存储在 data.frame 的行名中。因此出现错误消息。一个快速而肮脏的解决方法是:

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

但是您会得到一个带有日期字符串的额外列。理想情况下,您将构建 data.frame,并将日期作为开始的行名。

于 2010-11-28T14:52:24.097 回答
9

这是一个使用tidyquant包的解决方案,其中包含一个as_xts()将数据帧强制为 xts 对象的函数。它还包含as_tibble()将 xts 对象强制为 tibbles(“整洁”数据帧)。

重新创建数据框(请注意,日期时间类用于“整洁”的数据框,但可以使用任何明确的日期或日期时间类):

> 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具有正确日期或日期时间作为行名称的对象。

于 2017-03-02T19:41:25.643 回答
2

这是一个可能的解决方案:

library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)
于 2019-05-04T19:10:51.290 回答
0

您可以简单地执行以下操作

qxts <- xts(q[,2],q$t)

为我工作。

于 2020-09-12T09:52:04.137 回答
0

一个简单的解决方案是首先将 转换data.frame为 a data.table

library(data.table)

qxts <- as.xts(as.data.table(q))
于 2020-05-18T23:01:53.137 回答
0

现在看来它不起作用的原因很清楚,xts 不接受小标题,即使选择了列,它们仍然存储为小标题。核心数据可以转换为矩阵或向量。以下代码有效: xls.tbl <- xls(tbl$x, order.by = tbl$t)

于 2019-11-23T13:27:41.437 回答
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)

但是,所有数据都转换为字符。

于 2019-11-21T23:05:19.000 回答
0

尝试以下

q$t<-as.xts(q, order.by = as.Date(q$t), dateFormat="POSIXct")
于 2020-05-05T05:42:51.713 回答