将我的数据框转换为 xts 以进行时间序列分析时我做错了什么?

What am I doing wrong in converting my data frame into xts for time series analysis?

我的 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) 

我知道我需要先将 'Date' 列转换为日期,然后再进行 xts 转换。 从下面的 2 个 Whosebug 问题(见下面的链接)中,我做了这 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”

咨询过的Whosebug问题:

Converting a data frame to xts

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

我在这里错过了什么?

问题的几点评论:

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

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

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

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

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

下面的第二个替代方案将数据读入数据框 DF,然后使用 xts() 将其第二个参数转换为 "Date" class.

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" class 而不是 "Date" class 那么在第一个备选方案中使用

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"

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

library(dplyr)
library(timetk)
library(lubridate)

mydata %>% 
  mutate(Date = ymd(Date)) %>% 
  tk_xts(select = Sales)