首页 > 解决方案 > 在 R 中加入时间序列

问题描述

我想通过扩展已经存在的时间序列来创建一个每月间隔的时间序列。

我有“t1”时间序列:structure(c(49.25, 49.25, 30, 99.25, 99.25, 100.5, 101, 91.25), .Dim = c(1L, 8L), .Dimnames = list(NULL, c("2021 -03-31”、“2022-03-31”、“2022-05-31”、“2022-09-30”、“2022-12-31”、“2023-03-31”、“2023-05” -31", "2023-09-30")), .Tsp = c(1, 1, 1), class = c("mts", "ts", "matrix"))

我想扩展上述系列以包括每月观察。我怎样才能做到这一点?

标签: rjoinmergetime-series

解决方案


问题中的对象是一种奇怪的形式。它由 9 个独立的时间序列组成,列名由字符日期给出。首先将字符日期和值提取到具有 yearmon 时间类的 zoo 对象中——yearmon 直接表示没有日的年月。确保它的频率为 12 并将其转换为 ts 类,这将具有填补缺失月份的效果。最后将其延长到所需的日期。

library(zoo)

z <- zoo(t1[-1], as.yearmon(colnames(t1)[-1]), frequency = 12)
tt <- window(as.ts(z), end = c(2024, 11), extend = TRUE)
tt

给这个 ts 对象:

        Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
2021                49.25     NA     NA     NA     NA     NA     NA     NA     NA     NA
2022     NA     NA  49.25     NA  30.00     NA     NA     NA  99.25     NA     NA  99.25
2023     NA     NA 100.50     NA 101.00     NA     NA     NA  91.25     NA     NA     NA
2024     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA   

请注意,您可以使用View(as.zoo(tt))查看 tt 并可以使用na.approx(tt, na.rm = FALSE, rule = 2)内插值填充内部 NA,并使用最后一个非 NA 值填充尾随 NA。

笔记

输入在问题中显示为:

t1 <-  structure(c(49.25, 49.25, 30, 99.25, 99.25, 100.5, 101, 91.25), .Dim = c(1L, 8L), .Dimnames = list(NULL, c("2021-03-31", "2022-03-31", "2022-05-31", "2022-09-30", "2022-12-31", "2023-03-31", "2023-05-31", "2023-09-30")), .Tsp = c(1, 1, 1), class = c("mts", "ts", "matrix"))

推荐阅读