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

如何在R中批量处理含多工作表的多份Excel气象数据文件

批量处理气象站Excel文件的R语言解决方案

针对你的需求,我们可以把单个文件的处理逻辑封装成可复用的函数,再通过遍历文件夹中的所有Excel文件实现批量处理。以下是优化后的完整方案:

关键优化点

  1. 把重复的单文件处理逻辑封装成函数,避免冗余代码
  2. 用列表存储中间结果替代assign,更高效且避免环境变量混乱
  3. 简化月份数据整理逻辑,不用手动逐个创建月份数据框
  4. 自动遍历目标文件夹中的所有气象站Excel文件

完整代码

# 安装并加载所需包
install.packages(c("readxl", "dplyr", "tidyr"))
library(readxl)
library(dplyr)
library(tidyr)

# 定义处理单个气象站文件的函数
process_station <- function(file_path, years = 2008:2021) {
  # 存储每个年份的数据
  year_data_list <- list()
  
  for (year in years) {
    # 读取当前年份的工作表
    raw_data <- read_excel(file_path, 
                           range = "A7:AK38",
                           .name_repair = tolower, 
                           sheet = as.character(year))
    
    # 重命名第一列为Day
    colnames(raw_data)[1] <- "day"
    
    # 构建月份与对应列索引的映射
    month_col_mapping <- tibble(
      month = 1:12,
      tmin_col = seq(2, 37, by = 3),
      tmax_col = seq(3, 38, by = 3),
      tmean_col = seq(4, 39, by = 3)
    )
    
    # 循环处理每个月份的数据
    monthly_data_list <- lapply(1:nrow(month_col_mapping), function(m) {
      map_row <- month_col_mapping[m, ]
      tibble(
        Month = map_row$month,
        Day = raw_data$day,
        Tmin = raw_data[[map_row$tmin_col]],
        Tmax = raw_data[[map_row$tmax_col]],
        Tmean = raw_data[[map_row$tmean_col]]
      )
    })
    
    # 合并所有月份数据,添加年份列并整理格式
    yearly_data <- bind_rows(monthly_data_list) %>%
      mutate(Year = year) %>%
      rename(Tmin = min, Tmax = max, Tmean = avg) %>%
      mutate(Date = as.Date(paste(Year, Month, Day, sep = "-"))) %>%
      filter(!is.na(Date)) %>%
      mutate(Prec = NA) %>%
      select(Date, Year, Month, Day, Tmin, Tmax, Tmean, Prec)
    
    # 将当前年份数据加入列表
    year_data_list[[as.character(year)]] <- yearly_data
  }
  
  # 合并所有年份的数据
  full_station_data <- bind_rows(year_data_list)
  return(full_station_data)
}

# 设置目标文件夹路径(替换为你的实际路径)
station_folder <- "D:/Chill R Tutorial/ChillR-basic/AllBasin/"

# 获取文件夹中所有Excel文件的路径
station_files <- list.files(station_folder, pattern = "\\.xlsx$", full.names = TRUE)

# 批量处理所有文件并保存结果
for (file in station_files) {
  # 处理当前文件
  station_data <- process_station(file)
  
  # 生成输出文件名(原文件名替换为_Obs.csv)
  output_filename <- gsub("\\.xlsx$", "_Obs.csv", basename(file))
  output_path <- file.path(station_folder, output_filename)
  
  # 保存结果
  write.csv(station_data, output_path, row.names = FALSE)
  cat("已完成处理:", output_filename, "\n")
}

代码说明

  1. 函数封装:process_station函数接收文件路径和年份范围,返回该气象站的完整处理后数据
  2. 月份数据简化:通过列索引映射循环处理12个月,替代原代码中手动创建12个数据框的冗余操作
  3. 批量遍历:用list.files获取所有Excel文件,循环调用处理函数并自动保存结果
  4. 格式匹配:确保输出列顺序、命名规则与你单个文件处理的结果完全一致

注意事项

  • 确保所有气象站的Excel文件格式与Lashkargah_AT .xlsx完全一致(工作表命名、数据范围、列顺序)
  • 若年份范围需要调整,修改process_station函数的years参数即可
  • 输出文件会保存在原文件夹中,文件名格式为[原文件名]_Obs.csv

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:55:20