为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)
关键修改说明:
- 将多列数据合并为一个xts对象,简化后续月度聚合操作
- 使用
apply.monthly一次性完成所有变量的聚合,避免多次拆分合并的冗余操作 - 从xts对象的索引中提取年份(
%Y)和月份缩写(%b),添加为单独列 - 调整列顺序匹配期望输出格式
- 区分显式带Year/Month列的数据框和隐式时间信息的ts对象,满足不同展示与分析需求
内容的提问来源于stack exchange,提问作者Rancho
相关产品推荐
相关产品推荐

