将我的数据框转换为 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)
我的 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)