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

使用R语言ts()函数创建每日时间序列时异常的问题求助

问题描述

我尝试基于以下数据集结构构建每日时间序列:

> head(eg, n = 1)
# A tibble: 1 × 3
  date        var1  var2
  <date>     <dbl> <dbl>
1 2022-12-21   453 5324.
> tail(eg, n = 1)
# A tibble: 1 × 3
  date        var1  var2
  <date>     <dbl> <dbl>
1 2023-06-14   619 6311.
> glimpse(eg)
Rows: 176
Columns: 3
$ date <date> 2022-12-21, 2022-12-22, 2022-12-23, 2022-12-24, 2022-12-25, 202…
$ var1 <dbl> 453, 277, 359, 321, 251, 259, 258, 248, 317, 334, 326, 437, 449,…
$ var2 <dbl> 5324.073, 3107.398, 3716.288, 3315.080, 3541.247, 3810.109, 3905…

该数据集共176条数据,时间范围为2022年12月21日至2023年6月14日,但使用ts()函数处理后,得到的序列有178个值,且时间范围完全异常:

> prd <- eg[3]
> prd <- ts(prd, start = c(2022,1), end = c(2023,176), frequency = 2)
> prd
Time Series:
Start = c(2022, 1) 
End = c(2110, 2) 
Frequency = 2 

请问我哪里操作出错了?

错误分析与解决办法

你犯的三个关键错误

  • ts()不适合每日时间序列:ts()是给月度、季度这种固定年周期的序列设计的,frequency参数代表每年的周期数(比如月度设12,季度设4)。你设frequency=2等于告诉R每年只有2个周期,完全不符合每日数据的逻辑,直接导致时间索引计算混乱。
  • start/end参数用错了:ts()的c(年, 周期位置)里的“周期位置”是对应frequency的,比如frequency=12时,12代表当年12月。你用c(2023,176)加frequency=2,R会算成2023 + (176-1)/2 = 2110.5,自然时间范围全错。
  • 提取数据的方式不对:eg[3]提取的是整个tibble列(数据框结构),ts()处理数据框时会把每列当成单独的序列,导致值的数量异常。要提取单个数值向量,应该用eg$var2或者eg[[3]]。

正确的每日时间序列构建方式

优先用zoo或xts包,它们原生支持日期索引,比ts()适合每日数据:

# 安装并加载zoo包
install.packages("zoo")
library(zoo)

# 用var2和对应的日期构建时间序列
prd_zoo <- zoo(eg$var2, order.by = eg$date)

# 查看结果
prd_zoo

如果非要用基础R的ts(),需要先计算日期在当年的天数位置,不过这种方式要考虑闰年问题,比较麻烦:

# 计算起始日期是2022年的第几天(yday从0开始,所以加1)
start_day <- as.POSIXlt(eg$date[1])$yday + 1
# 计算结束日期是2023年的第几天
end_day <- as.POSIXlt(eg$date[nrow(eg)])$yday + 1

# 构建ts对象,frequency设为365
prd_ts <- ts(eg$var2, start = c(2022, start_day), end = c(2023, end_day), frequency = 365)

内容的提问来源于stack exchange,提问作者Diogo Bichon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:35:12