R 在将数据帧转换为xts进行时间序列分析时,我做错了什么?
MyR 在将数据帧转换为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
数据框
称为“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)