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

批量补全多站点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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:27:21