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

为ts对象添加年份与月份列的技术需求及问题

问题

我有一份CSV格式的每日时间序列气候数据,包含date、Prec、Tmax、Tmin四列。需要将其转换为包含Year、Month、Prec、Tmax、Tmin五列的月度时间序列对象。

现有转换代码如下:

#Load Required packages
library(xts)

#Loading Data
df <- read.csv("ClimData.csv")

#Create Rdate format
date <- as.Date(df$date, format = '%m/%d/%Y')

#Convert data to an xts Objects
prec <- xts(df$Prec, date)
tmin <-xts(df$Tmin, date)
tmax <-xts(df$Tmax, date)

#Convert to Monthly Values
prec_m <- apply.monthly(prec, sum)
tmin_m <- apply.monthly(tmin, mean)
tmax_m <- apply.monthly(tmax, mean)

#Create Data frames
d_prec <- as.data.frame(prec_m)
d_tmin <- as.data.frame(tmin_m)
d_tmax <- as.data.frame(tmax_m)

#Combine the data frames
dt <- cbind.data.frame(d_prec, d_tmin, d_tmax)
colnames(dt) <- c('Prec', 'Tmin', 'Tmax')

#Convert to a Time series objects
dt <- ts(dt[c(1:3)], start = c(2020, 1), end = c(2023, 12), frequency = 12)
View(dt)

plot.ts(dt)

当前输出结果:

> dt
          Prec     Tmin     Tmax
Jan 2020 209.2 17.78248 28.12348
Feb 2020 194.4 17.15297 29.27645
Mar 2020 313.9 16.96681 28.96835
Apr 2020 219.3 16.51617 28.64863
May 2020   0.0 14.40332 29.21816
Jun 2020   0.0 13.86453 28.98593
Jul 2020   0.0 13.91129 28.75810
Aug 2020   0.0 15.35545 30.56526
Sep 2020   0.0 16.52877 31.66443
Oct 2020  17.1 17.34668 30.20081
Nov 2020 170.7 16.71463 29.17023
Dec 2020 130.0 17.08645 28.77268
Jan 2021 175.0 17.35477 26.90087
Feb 2021 448.7 17.22093 29.13764

期望输出结果:

> dt
    Month Year Prec   Tmin     Tmax
Jan 2020 209.2 17.78248 28.12348
Feb 2020 194.4 17.15297 29.27645
Mar 2020 313.9 16.96681 28.96835
Apr 2020 219.3 16.51617 28.64863
May 2020   0.0 14.40332 29.21816
Jun 2020   0.0 13.86453 28.98593
Jul 2020   0.0 13.91129 28.75810
Aug 2020   0.0 15.35545 30.56526
Sep 2020   0.0 16.52877 31.66443
Oct 2020  17.1 17.34668 30.20081
Nov 2020 170.7 16.71463 29.17023
Dec 2020 130.0 17.08645 28.77268
Jan 2021 175.0 17.35477 26.90087
Feb 2021 448.7 17.22093 29.13764

解决方案

注意:R中的ts对象本身不会将Year和Month作为单独列存储,其时间信息通过start、frequency参数隐式定义。如果需要显式展示Year和Month列,需先将处理后的数据转换为数据框并提取时间信息,再按需转换为ts对象。

修改后的代码如下:

# Load Required packages
library(xts)

# Loading Data
df <- read.csv("ClimData.csv")

# Create R date format
date <- as.Date(df$date, format = '%m/%d/%Y')

# Convert data to a single xts Object (更高效的聚合方式)
clim_xts <- xts(df[, c("Prec", "Tmin", "Tmax")], date)

# Convert to Monthly Values with one call
clim_monthly <- apply.monthly(clim_xts, function(x) {
  data.frame(
    Prec = sum(x$Prec),
    Tmin = mean(x$Tmin),
    Tmax = mean(x$Tmax)
  )
})

# Convert to data frame and extract Year/Month
dt <- as.data.frame(clim_monthly)
# 从xts索引中提取年份和月份缩写
dt$Year <- format(index(clim_monthly), "%Y")
dt$Month <- format(index(clim_monthly), "%b")
# 调整列顺序匹配期望格式
dt <- dt[, c("Month", "Year", "Prec", "Tmin", "Tmax")]

# 如需保留ts对象特性,单独创建ts对象(ts对象不含Year/Month列)
clim_ts <- ts(dt[, c("Prec", "Tmin", "Tmax")], start = c(2020, 1), frequency = 12)

# 查看带Year/Month列的数据框
print(dt)
# 查看标准ts对象
print(clim_ts)

plot.ts(clim_ts)

关键修改说明:

  1. 将多列数据合并为一个xts对象,简化后续月度聚合操作
  2. 使用apply.monthly一次性完成所有变量的聚合,避免多次拆分合并的冗余操作
  3. 从xts对象的索引中提取年份(%Y)和月份缩写(%b),添加为单独列
  4. 调整列顺序匹配期望输出格式
  5. 区分显式带Year/Month列的数据框和隐式时间信息的ts对象,满足不同展示与分析需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:32:06