我知道这个话题已经有了很多,但我似乎无法得到我想要的东西。 我读过:
how to convert data frame into time series in R
Convert data frame with date column to timeseries
和其他几个人一样,但不能让它发挥作用。
我有以下df
df <- data.frame(CloseTime = c("2017-09-13 19:15:00","2017-09-13 19:30:00","2017-09-13 19:45:00","2017-09-13 20:00:00","2017-09-13 20:15:00"),
OpenPice = c(271.23,269.50,269.82,269.10,269.50),
HightPrice = c(271.23,269.50,269.82,269.10,269.50),
LowPrice = c(271.23,269.50,269.82,269.10,269.50),
ClosePrice = c(271.23,269.50,269.82,269.10,269.50))
我希望将其转换为ts
个对象,间隔为15分钟并分解时间序列。
我还读到动物园包允许你分解特定的多个间隔,即15分钟,1小时,1天?
有人可以帮忙。如何将其转换为ts对象并分解我的ts对象?
答案 0 :(得分:1)
只是为了再现性目的,另一个玩具示例具有更长的时间。
df <-
data.frame(
CloseTime = seq(as.POSIXct("2017-09-13 19:15:00"),as.POSIXct("2018-10-20 21:45:00"),by="15 mins"),
ClosePrice1 = cumsum(rnorm(38603)),
ClosePrice2 = cumsum(rnorm(38603)),
ClosePrice3 = cumsum(rnorm(38603))
)
我发现使用dplyr和lubridate::floor_date将时间序列聚合到不同的时间间隔要好得多。可以使用mean
,min
,max
,first
进行汇总,而不是last
。我建议留在tidyr周围以保持代码可读。下面的例子转换成30分钟的间隔。
library(lubridate); library(dplyr); library(magrittr)
df30m <-
df %>%
group_by( CloseTime = floor_date( CloseTime, "30 mins")) %>%
summarize_all(mean)
可以将Data.frame转换为时间序列对象,例如zoo
而不是ts
,以便进行分解。
library(zoo)
df30m_zoo <- zoo( df30m[-1], order.by = df30m$CloseTime )
df30m_ts <- ts(df30m_zoo, start=1, frequency = 2 * pi)
df30m_decomposed <- decompose(df30m_ts)
答案 1 :(得分:1)
这些分数已经相隔15分钟,所以假设您需要1天的时间,这将转换它。一天中有24 * 60 * 60秒(该时间段)但您可以将分母更改为一段时间内获得不同时段的秒数。您将需要至少两个数据周期来分解它。
library(zoo)
z <- read.zoo(df)
time(z) <- (as.numeric(time(z)) - as.numeric(start(z))) / (24 * 60 * 60)
as.ts(z)
,并提供:
Time Series:
Start = c(0, 1)
End = c(0, 5)
Frequency = 96
OpenPice HightPrice LowPrice ClosePrice
0.00000000 271.23 271.23 271.23 271.23
0.01041667 269.50 269.50 269.50 269.50
0.02083333 269.82 269.82 269.82 269.82
0.03125000 269.10 269.10 269.10 269.10
0.04166667 269.50 269.50 269.50 269.50
在问题中没有提出要求,在另一个答案中,数据被转换为30分钟。这可以很容易地做到这一点:
library(xts) # also loads zoo
z <- read.zoo(df)
to.minutes30(z)