批量补全多站点CSV日降水数据缺失日期并填充NA值
R语言批量补全降水数据日期序列实现方案
依赖准备
使用tidyverse套件完成数据读取、日期处理、连接匹配操作,首次运行需执行安装命令:
install.packages("tidyverse")
后续运行直接加载包即可:
library(tidyverse) library(lubridate)
单文件处理函数
核心逻辑为拆分文件名提取元数据、解析日期格式、生成全年完整时间序列、左连接匹配观测值、输出结果,代码可直接运行:
process_single_csv <- function(input_path, output_path = NULL, overwrite = FALSE) { # 从文件名拆分站点编码、年份,适配「站点编码_年份_combined.csv」命名规则 file_base <- basename(input_path) name_split <- strsplit(file_base, "_")[[1]] station_id <- name_split[1] target_year <- as.integer(name_split[2]) # 读取原始csv,解析日期列(适配月/日/年 时:分格式) raw_data <- read_csv(input_path, show_col_types = FALSE) %>% mutate(Date = mdy_hm(Date)) # 生成目标年份全年逐日时间序列,固定每日6:00时间戳与原始数据对齐 full_date_seq <- tibble( Date = seq.POSIXt( from = ymd_h(paste0(target_year, "-01-01 6")), to = ymd_h(paste0(target_year, "-12-31 6")), by = "day" ) ) # 匹配观测值,缺失日期自动填充NA,统一补全站点编码、转换降水列为数值型 result <- full_date_seq %>% left_join(raw_data, by = "Date") %>% mutate( Station_code = as.integer(station_id), Precipitation = as.numeric(Precipitation) ) %>% select(Station_code, Date, Precipitation) # 保持与原文件列顺序一致 # 确定输出路径 if (is.null(output_path)) { out_file <- ifelse(overwrite, input_path, gsub("\\.csv$", "_filled.csv", input_path)) } else { if (!dir.exists(dirname(output_path))) dir.create(dirname(output_path), recursive = TRUE) out_file <- output_path } # 写出处理后文件 write_csv(result, out_file) return(paste("已完成处理:", out_file)) }
批量执行代码
自动递归遍历所有子文件夹内符合命名规则的csv文件,批量完成处理。使用前将路径替换为本地实际路径即可:
# 配置路径 raw_data_root <- "替换为你的原始数据根文件夹路径" # 所有分年/分站点归档的csv存放在此目录下 processed_data_root <- "替换为处理后文件的存储路径" # 若要覆盖原文件可设为NULL,同时将overwrite设为TRUE # 递归查找所有符合命名规则的csv文件 all_csv_files <- list.files( path = raw_data_root, pattern = "^[0-9]+_[0-9]{4}_combined\\.csv$", recursive = TRUE, full.names = TRUE ) # 循环批量处理 walk(all_csv_files, ~{ rel_path <- gsub(paste0("^", raw_data_root), "", .x) out_path <- if (!is.null(processed_data_root)) paste0(processed_data_root, rel_path) else NULL process_single_csv(.x, output_path = out_path, overwrite = FALSE) })
注意事项
- 处理后单文件行数符合预期:平年365行,闰年366行
- 提供的示例数据测试后,缺失的1月3日、1月8日、1月13日等日期将自动填充NA,已有观测值与原文件完全匹配
- 若原始数据日期格式存在偏差,调整
mdy_hm()为对应解析函数即可,如年-月-日格式使用ymd_hm() - 开启覆盖模式前务必备份原始数据,避免误操作丢失文件
内容的提问来源于stack exchange,提问作者PaulG
相关产品推荐
相关产品推荐

