【问题标题】:What am I doing wrong in converting my data frame into xts for time series analysis?在将我的数据框转换为 xts 以进行时间序列分析时,我做错了什么?
【发布时间】:2018-04-11 09:18:27
【问题描述】:

我的data frame 被称为“mydata”,它只有 2 列,如下所示:

Date          Sales
2016-07-01    51256
2016-08-01    75892
2016-09-01    67115
...

运行以下代码 str(mydata) 会得到以下结果:

'data.frame':   28 obs. of  2 variables:
 $ DATE  : chr  "2016-07-01" "2016-08-01" "2016-09-01" ...
 $ PKGREV: num   51256 75892 67115 ...

我在 R 中加载了以下库:

library(ggplot2)
library(dplyr)
library(scales)
library(ggthemes)
library(magrittr)
library(h2o)
library(timetk)
library(tidyquant) 

我知道在进行xts 转换之前,我需要先将“日期”列转换为日期。 从下面的 2 个 Stackoverflow 问题(见下面的链接),我做了这 2 次尝试:

尝试 1:

 mydata2 <- xts(mydata[,-1], order.by=mydata[,1])    


Error message: 

Error in xts(mydata[, -1], order.by = mydata[, 1]) : 
order.by requires an appropriate time-based object

尝试 2:

mydata2 <- xts(mydata[, -1], order.by=as.POSIXct(mydata$Date))

Error message: 

 Error in as.POSIXct.default(mydata$Date) : 
 do not know how to convert 'mydata$Date' to class “POSIXct”

咨询的 StackOverflow 问题:

Converting a data frame to xts

Converting data.frame to xts order.by requires an appropriate time-based object

我在这里错过了什么?

【问题讨论】:

  • 你试过先运行mydata$Date &lt;- as.Date(mydata$Date)吗?
  • 当我运行您提到的代码时,我收到以下错误消息:“as.Date.default(mydata$Date) 中的错误:不知道如何将 'mydata$Date' 转换为类“日期”

标签: r date dataframe time-series xts


【解决方案1】:

关于这个问题的几位专家:

  • 您似乎没有将时间索引转换为"Date" 类——如果数据是每月,您可以交替使用"yearmon" 类。

  • 关于尝试 2,您不应将 "POSIXt" 用于日期数据。这将使您面临不必要的时区编码错误的可能性。此类错误可能很微妙,因此难以检测。如果您确实使用"POSIXt",那么请使用"POSIXct" 类而不是"POSIXlt" 类。

  • 根据您的评论,您在问题中没有显示数据的某些方面。下面我们提供了一个独立的可重现示例和两组可供选择的代码,它们都可以工作。您需要确定您的设置与此有何不同。

为了使下面的解决方案保持独立,我们使用最后注释中定义的Lines,但您可以用您的文件名替换text=Lines,例如"mydata.dat".

下面的第一个替代方案使用read.zoo 将数据读入"zoo" 类对象,然后将其转换为"xts" 类对象。 read.zoo 将自动将第一列转换为"Date" 类(除非您使用另外指定的参数)。 zoo包由xts包自动加载。

下面的第二种选择将数据读入数据框DF,然后使用xts()将其第二个参数转换为"Date"类。

library(xts)

# 1
z <- read.zoo(text = Lines, header = TRUE)
as.xts(z)

# 2
DF <- read.table(text = Lines, header = TRUE)
with(DF, xts(Sales, as.Date(Date)))

年月

如果你想使用"yearmon" 类而不是"Date" 类,那么在第一个替代使用中

x <- read.zoo(text = Lines, header = TRUE, FUN = as.yearmon)

第二个:

with(DF, xts(Sales, as.yearmon(Date)))

注意:输入,Lines,以可重现的形式是:

Lines <- "
Date          Sales
2016-07-01    51256
2016-08-01    75892
2016-09-01    67115"

【讨论】:

    【解决方案2】:

    您可以使用lubridate 包中的ymd 函数将字符串转换为日期。然后你可以从timetk使用tk_xts

    library(dplyr)
    library(timetk)
    library(lubridate)
    
    mydata %>% 
      mutate(Date = ymd(Date)) %>% 
      tk_xts(select = Sales)
    

    【讨论】:

    • 我在运行代码时收到以下消息:使用列 DATE for date_var。警告消息:在 tk_xts_.data.frame(data = data, select = select, date_var = date_var, : Non-numeric columns being dropped: DATE
    • 警告不是问题。我编辑了选择该列的答案,因此您将不会再看到警告。
    • 谢谢。但是我现在的问题是转换为 xts 后的第一列没有标题。我仍然需要该列具有标题“日期”。我现在运行代码时的消息:使用列 DATE for date_var。
    • 据我所知,您不能为xts 对象的索引命名。你为什么需要它?也许我可以尝试想出一个不同的解决方案。
    • 我需要它能够在继续分析之前对数据执行可视化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2021-06-01
    • 1970-01-01
    • 2018-01-22
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多