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

如何将给定数据转换为适用于ARIMA模型预测的时间序列?

将年度月度数据转换为ARIMA可用的时间序列

ARIMA模型要求输入是按时间顺序连续排列的单变量时间序列,当前数据为宽格式(每年一行、每月一列),需按以下步骤转换:

1. 宽格式转长格式

把年份、月份拆分为独立的时间标识列,将月度数值合并为单一数值列,让每一行对应一个时间点的观测值。

R语言实现示例

# 加载工具包
library(tidyr)
library(dplyr)

# 构造原始数据框
df <- data.frame(
  X = 2012:2021,
  Jan = c(24.78,24.82,24.01,24.60,25.20,25.28,24.84,23.73,25.41,24.70),
  Feb = c(26.82,26.04,25.75,26.11,27.62,26.88,26.47,26.75,26.75,25.90),
  Mar = c(29.75,28.83,29.08,29.19,29.51,29.55,29.40,29.57,29.30,29.62),
  Apr = c(31.19,30.85,31.83,30.71,31.86,31.88,31.20,31.59,31.37,31.42),
  May = c(31.87,32.44,31.23,32.69,32.34,32.74,31.10,32.53,32.98,31.68),
  Jun = c(31.00,29.70,33.08,28.90,28.64,29.89,30.28,31.30,30.05,30.17),
  Jul = c(28.48,27.86,29.88,29.21,27.98,28.41,28.30,29.48,28.23,28.13),
  Aug = c(27.39,27.66,28.14,28.24,28.36,27.60,27.33,27.78,27.53,28.08),
  Sep = c(27.08,27.73,27.40,27.58,27.12,27.72,27.55,27.54,27.68,27.68),
  Oct = c(26.55,27.00,27.11,27.82,26.51,27.23,27.40,27.05,27.01,27.29),
  Nov = c(24.36,24.87,25.38,25.37,25.69,25.43,26.98,25.44,25.57,25.59),
  Dec = c(23.62,22.94,24.37,24.71,25.12,24.08,24.77,24.46,22.86,23.16)
)

# 转换为长格式
long_df <- df %>%
  gather(key = "Month", value = "Value", -X) %>%
  rename(Year = X)

# 查看转换结果
head(long_df)

Python语言实现示例

import pandas as pd

# 构造原始数据
data = {
    'X': [2012,2013,2014,2015,2016,2017,2018,2019,2020,2021],
    'Jan': [24.78,24.82,24.01,24.60,25.20,25.28,24.84,23.73,25.41,24.70],
    'Feb': [26.82,26.04,25.75,26.11,27.62,26.88,26.47,26.75,26.75,25.90],
    'Mar': [29.75,28.83,29.08,29.19,29.51,29.55,29.40,29.57,29.30,29.62],
    'Apr': [31.19,30.85,31.83,30.71,31.86,31.88,31.20,31.59,31.37,31.42],
    'May': [31.87,32.44,31.23,32.69,32.34,32.74,31.10,32.53,32.98,31.68],
    'Jun': [31.00,29.70,33.08,28.90,28.64,29.89,30.28,31.30,30.05,30.17],
    'Jul': [28.48,27.86,29.88,29.21,27.98,28.41,28.30,29.48,28.23,28.13],
    'Aug': [27.39,27.66,28.14,28.24,28.36,27.60,27.33,27.78,27.53,28.08],
    'Sep': [27.08,27.73,27.40,27.58,27.12,27.72,27.55,27.54,27.68,27.68],
    'Oct': [26.55,27.00,27.11,27.82,26.51,27.23,27.40,27.05,27.01,27.29],
    'Nov': [24.36,24.87,25.38,25.37,25.69,25.43,26.98,25.44,25.57,25.59],
    'Dec': [23.62,22.94,24.37,24.71,25.12,24.08,24.77,24.46,22.86,23.16]
}

df = pd.DataFrame(data)

# 转换为长格式
long_df = df.melt(id_vars=['X'], var_name='Month', value_name='Value').rename(columns={'X':'Year'})

# 查看转换结果
print(long_df.head())

2. 创建连续时间索引

将年份和月份合并为标准日期格式,生成按时间顺序排列的索引,确保序列连续性。

R语言实现示例

# 生成日期列
long_df$Date <- as.Date(paste(long_df$Year, long_df$Month, "01", sep = "-"), format = "%Y-%b-%d")

# 按日期排序
long_df <- long_df %>% arrange(Date)

# 转换为月度时间序列对象
ts_data <- ts(long_df$Value, start = c(2012, 1), frequency = 12)

# 查看时间序列
head(ts_data)

Python语言实现示例

# 合并年份与月份为日期列
long_df['Date'] = pd.to_datetime(long_df['Year'].astype(str) + '-' + long_df['Month'])

# 按日期排序
long_df = long_df.sort_values('Date').reset_index(drop=True)

# 转换为带Datetime索引的时间序列
ts_series = long_df.set_index('Date')['Value']

# 强制设置月度频率(每月第一天)
ts_series = ts_series.asfreq('MS')

# 查看时间序列
print(ts_series.head())

3. 验证数据完整性

检查序列是否存在缺失值、重复时间点或时间断点,ARIMA要求数据连续无缺失。

R语言验证

# 检查缺失值
any(is.na(ts_data))

# 检查时间范围
range(time(ts_data))

Python语言验证

# 检查缺失值数量
print(ts_series.isna().sum())

# 检查时间范围
print(ts_series.index.min(), ts_series.index.max())

完成以上步骤后,得到的ts_data(R)或ts_series(Python)即可直接用于ARIMA模型的拟合与预测。

内容的提问来源于stack exchange,提问作者Jai Surya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:27:23