R语言合并两个时间序列及拆分重组的技术问询
合并R中连续时间序列的正确方法
问题场景
你有两个连续的周度时间序列:
ts1:覆盖2010年第1周至2019年最后一周ts2:ts1结束后新增的500周数据(希望能自动从ts1的结束点开始生成)
你的代码如下:
# ts1: 2010年第1周至2019年最后一周 ts1 <- ts(rnorm(1040, mean = 100, sd = 50), start = c(2010, 1), frequency = 52) # ts2: ts1结束后新增的500周数据(注:我想知道是否能自动从ts1的结束点开始) ts2 <- ts(rnorm(500, mean = 150, sd = 60), start = c(2020, 1), frequency = 52)
你尝试用ts.union(ts1, ts2)合并,但得到的是带NA的多列时间序列,且起始时间异常,不符合“合并为单个时间序列对象”的预期:
> head(comb) Time Series: Start = c(2000, 1) End = c(2000, 6) Frequency = 52 ts1 ts2 2000.000 37.56999 NA 2000.019 46.10463 NA 2000.038 112.50387 NA 2000.058 94.01130 NA 2000.077 84.95737 NA 2000.096 -16.03819 NA
错误原因
ts.union()的作用是按时间轴对齐多个序列,将它们合并为多列的时间序列,缺失的时间点会补NA,并非将连续序列拼接成单个时间序列,因此不符合你的需求。
正确解决方案
1. 自动衔接生成ts2并合并
先通过end(ts1)获取ts1的结束时间,自动计算ts2的起始点,避免手动指定年份和周数,再将两个序列的数值拼接成新的时间序列:
# 获取ts1的结束时间(格式为c(年份, 周数)) end_ts1 <- end(ts1) # 计算ts2的起始时间:ts1结束后的下一周 start_ts2 <- c(end_ts1[1], end_ts1[2] + 1) # 处理周数超过52的进位情况(如2019年第52周的下一周是2020年第1周) if (start_ts2[2] > frequency(ts1)) { start_ts2 <- c(start_ts2[1] + 1, start_ts2[2] - frequency(ts1)) } # 自动衔接ts1生成ts2 ts2 <- ts(rnorm(500, mean = 150, sd = 60), start = start_ts2, frequency = 52) # 合并为单个时间序列 comb_ts <- ts(c(ts1, ts2), start = start(ts1), frequency = frequency(ts1))
2. 简化拼接(适用于已知序列连续的情况)
如果确认两个序列频率相同且时间完全连续,可直接拼接数值并重新构造ts对象:
comb_ts <- ts(c(ts1, ts2), start = start(ts1), frequency = 52)
满足拆分与重新合并的需求
若未来需要任意拆分时间序列并恢复原序列,推荐使用window()函数(基础ts对象)或转换为zoo/xts对象处理:
方法1:使用基础ts对象的window函数
# 拆分:以2015年为界 ts_a <- window(comb_ts, start = c(2015, 1)) # 2015年及之后的数据 ts_b <- window(comb_ts, end = c(2014, 52)) # 2014年及之前的数据 # 重新合并(注意顺序:先ts_b再ts_a才能恢复原序列) ts_recover <- ts(c(ts_b, ts_a), start = start(comb_ts), frequency = 52) # 验证是否与原序列一致 identical(comb_ts, ts_recover)
方法2:转换为zoo对象(更直观的日期筛选)
library(zoo) # 将合并后的ts对象转为zoo对象 zoo_ts <- as.zoo(comb_ts) # 拆分:按日期筛选 ts_a <- window(zoo_ts, start = as.Date("2015-01-01")) ts_b <- window(zoo_ts, end = as.Date("2014-12-31")) # 重新合并恢复原序列 ts_recover <- rbind(ts_b, ts_a) # 验证一致性 identical(zoo_ts, ts_recover)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

