【问题标题】:XTS does not recognize datetime as an appropriate time-based objectXTS 不将日期时间识别为适当的基于时间的对象
【发布时间】:2021-02-03 09:55:38
【问题描述】:

我正在使用 R。我有一组值和一个日期时间索引。我想在 xts 中转换 tibble。

这里是示例数据和我使用的代码:

Date <- c("2010-01-04" , "2010-01-04")
Time <- c("04:00:00", "06:00:00")
value <- c(1, 2)          
df <- as_tibble(value) %>% add_column(Date = Date, Time = Time)
df <- df %>% mutate(datetime = as.POSIXct(paste(Date, Time), format="%Y-%m-%d %H:%M:%S"))

library(xts)
dfxts <- as.xts(df[,1], order.by=df[,4])

但是,我收到以下错误:

Error in xts(x, order.by = order.by, frequency = frequency, ...) : 
    order.by requires an appropriate time-based object

知道是什么原因造成的吗?日期时间应该是一个合适的基于时间的对象...非常感谢。

【问题讨论】:

    标签: r xts


    【解决方案1】:

    order_by 的参数必须是向量。当您使用foo[,bar]tbl_df 中提取时,返回对象的类不是向量,而是tbl_df。使用df[[4]]

    【讨论】:

      【解决方案2】:

      您应该重新检查每个步骤并检查您得到的结果。实际上,我发现在 one 容器中最容易做到这一点。你可以用tbl,我正好喜欢data.frame

      让我们首先从您的数据中构建一个data.frame

      R> Date <- c("2010-01-04" , "2010-01-04")
      R> Time <- c("04:00:00", "06:00:00")
      R> value <- c(1, 2)
      R> df <- data.frame(Date=Date, Time=Time, value=value)
      R> df
              Date     Time value
      1 2010-01-04 04:00:00     1
      2 2010-01-04 06:00:00     2
      R> 
      

      然后让我们整理解析日期和时间信息并检查一下:

      R> df[,"pt"] <- as.POSIXct(paste(Date, Time))
      R> df
              Date     Time value                  pt
      1 2010-01-04 04:00:00     1 2010-01-04 04:00:00
      2 2010-01-04 06:00:00     2 2010-01-04 06:00:00
      R> 
      

      之后,只需使用正确的组件调用xts

      R> x <- xts(df[,"value"], order.by=df[,"pt"])
      R> x
                          [,1]
      2010-01-04 04:00:00    1
      2010-01-04 06:00:00    2
      R> 
      

      编辑或者你可以一步完成没有任何其他包,但放弃了逐步完成中间步骤的能力:

      R> x2 <- xts(value, order.by=as.POSIXct(paste(Date, Time)))
      R> x2
                          V1
      2010-01-04 04:00:00  1
      2010-01-04 06:00:00  2
      R> all.equal(x, x2)
      [1] TRUE
      R> 
      

      【讨论】:

      • 需要明确的是,OP 的数据是 tbl_df 对象,而不是 data.frame。您的示例之所以有效,是因为 base::[.data.frametibble:::[.tbl_df 的工作方式不同。如果仅提取了 data.frame 中的一个变量,[.data.frame 会将返回的对象强制转换为向量。这不是[.tbl_df 的行为。
      • OP 请求了一种将 tibble 转换为 xts 对象的方法。
      • 只是为了您的教育,我添加了一个选项,可以从三个初始向量完成所有操作。看,妈,没有data.frame,也没有tbl。一定是魔法......
      • 请重新阅读标题。它在哪里说tbl?在我的阅读中,OP 急于使用 tbl,然后因为使用了一个而迷路了。我展示了两种选择。也许我们应该让 OP 为我们决定他/她想要什么。
      • 听着,我真的不想和你扯上关系。 OP 在他们的帖子中说“我有一个值和一个日期时间索引”。您的答案显然是正确的,但没有解决 OP 的情况或问题。数据只是样本数据。
      猜你喜欢
      • 2021-11-20
      • 2014-06-07
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多