将df转换为ts对象并在R中以15分钟的间隔分解

时间:2017-09-19 13:44:35

标签: r time-series

我知道这个话题已经有了很多,但我似乎无法得到我想要的东西。 我读过:

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对象?

2 个答案:

答案 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将时间序列聚合到不同的时间间隔要好得多。可以使用meanminmaxfirst进行汇总,而不是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)