在 R 中将 xts 强制转换为 ts

Coerce xts to ts in R

我有 xts 10 天数据的时间序列对象。数据以分钟频率采样。因此,对于每一天,我有 1440 个观察值。我需要将 xts 强制转换为 ts 对象,以便我可以使用 example 中使用的 stl 函数。但是,在强制转换时,R 会产生错误 as

ts(min_data,start=start(min_data),end = end(min_data),frequency=10)
Error in ts(min_data, start = start(min_data), end = end(min_data), frequency = 10) : 
  invalid time series parameters specified

我将频率设置为10,因为我使用的是10天的数据。我不确定它应该是 10 还是 1440。谁能帮我解决这个错误。

MWE 为

library(xts)
timevalues="20150101 0000/20150110 2359"
timesequence<- timeBasedSeq(timevalues)
min_data<-xts(rnorm(14400),timesequence)
ts_data<- ts(min_data,start=start(min_data), end = end(min_data),frequency=10)

更新 尽管我可以按照@Pascal 的建议使用 stl 函数绘制图形,但我仍然缺少图形 x 轴中的时间分量。任何帮助将不胜感激。

library(xts)
library(ggplot2)
library(reshape2)

set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)

ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")
time.series <- as.data.frame(cbind(ts_data, out$time.series))
colnames(time.series) <- c("Data", "Seasonal", "Trend", "Remainder")
time.series$Date <- timesequence
time.series <- melt(time.series, 'Date')

ggplot(time.series, aes(x=Date, y=value)) + 
  geom_line() +
  facet_free(variable~.)

一个仅限 xts 的解决方案,基于我在 .

中的想法
library(xts)
set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)

ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")

ts_out <- merge(min_data, out$time.series)
plot.zoo(ts_out)

我想你要找的是以下内容:

xts2ts <- function(XD) {
             maxRow <- nrow(XD)
             startYM <- c(.indexyear(XD[1]) + 1900, .indexmon(XD[1]) + 1L)
             endYM <- c(.indexyear(XD[maxRow]) + 1900, .indexmon(XD[maxRow]) + 1L)
             ts(as.numeric(XD), start = startYM, end = endYM, frequency = 12L)
}

我最近发现了一个名为 "tsbox" 的软件包。

它承诺在时间序列类型之间轻松转换。 (这里有教程:https://cran.r-project.org/web/packages/tsbox/vignettes/tsbox.html

在这种情况下可能会有用。

举个例子:

library(tsbox)
nowTS <-ts_ts(formerXTS)

或者反过来,如果你想将 ts 转换回 xts 系列

library(tsbox)
nowXTS <-ts_xts(nowTS)

如果你有每月、每季度和每年频率的 xts 数据,它可能会有用(使用包:xts、stats、data.table、zoo)

xts_ts <- function(xts_data) {
  freq_list <-
    data.table::data.table(
      freq = c('month', 'quarter', 'year'),
      freq_n = c(12L, 4L, 1L),
      freq_format = c('%Y, %m', '%Y, %q', '%Y')
    )

  d_ferq <- xts::periodicity(xts_data)[["label"]]
  freq_n <- freq_list[freq == d_ferq, freq_n]
  freq_format <- freq_list[freq == d_ferq, freq_format]

  # Put NA if missing date
  empty <-
    zoo::zoo(order.by = seq.Date(zoo::index(xts_data)[1], zoo::index(xts_data)[nrow(xts_data)], by = d_ferq))
  no_misssing <- merge(xts_data, empty)

  if (d_ferq == 'quarter') {
    start_date <-
      format(zoo::as.yearqtr(xts::periodicity(xts_data)[["start"]]), freq_format)

  } else {
    start_date <-
      format(zoo::as.Date(xts::periodicity(xts_data)[["start"]]), freq_format)
  }

  stats::ts(zoo::coredata(no_misssing),
     start = as.integer(strsplit(start_date, split = ',')[[1]]),
     frequency = freq_n)
}