You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:07:07