R 在将数据帧转换为xts进行时间序列分析时,我做错了什么?

R 在将数据帧转换为xts进行时间序列分析时,我做错了什么?,r,date,dataframe,time-series,xts,R,Date,Dataframe,Time Series,Xts,My数据框称为“mydata”,它只有两列,如下所示: 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

My
数据框
称为“mydata”,它只有两列,如下所示:

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

mydata2关于这个问题的几点评论:

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

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

  • 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)))
    
  • 根据您的评论,您在问题中没有显示数据的某些方面。下面,我们提供了一个独立的可复制示例和两组可供选择的代码,这两组代码都有效。您需要确定您的设置与此有何不同

为了使下面的解决方案保持独立,我们使用结尾注释中定义的
,但您可以用文件名替换
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)))
在第二种情况下:

with(DF, xts(Sales, as.yearmon(Date)))
注:可复制形式的输入,

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

Lines您可以使用
lubridate
软件包中的
ymd
功能将字符串转换为日期。然后您可以从
timetk

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

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

您是否尝试过运行
mydata$Date当我运行您提到的代码时,我收到以下错误消息:“as.Date.default(mydata$Date)中的错误:不知道如何将'mydata$Date'转换为类“Date”请检查。我在运行代码时收到以下消息:使用列
DATE
作为日期变量。警告消息:在tk\u xts\uu.data.frame中(data=data,select=select,date\u var=date\u var,:正在删除的非数字列:date警告这不是问题。我编辑了选择列的答案,因此您将不再看到警告。谢谢。但是我现在的问题是,转换为xts后的第一列没有标题。我仍然需要该列具有header“Date”。我现在运行代码时的消息:使用列
Date
作为日期变量。据我所知,您不能为
xts
对象的索引命名。为什么需要它?也许我可以尝试提出不同的解决方案。我需要它在继续分析之前能够对数据执行可视化。
library(dplyr)
library(timetk)
library(lubridate)

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