从嵌套文件夹多CSV提取指定行并转换为时间序列数据集
嵌套CSV提取指定雨量站时间序列解决方案
问题拆解
你当前的代码不仅存在语法错误,还未实现核心的站点筛选与时间序列转换逻辑——需要从嵌套文件夹的409个单月CSV中,提取指定雨量站的每日数据,最终生成带时间戳的标准DataFrame。
分步实现代码
1. 递归获取所有CSV文件路径
用list.files的递归参数扫遍嵌套文件夹,确保不漏掉任何文件:
# 递归获取所有CSV的完整路径 csv_files <- list.files("station_data", pattern = "\\.csv$", full.names = TRUE, recursive = TRUE)
2. 定义单CSV处理函数
每个CSV对应单月数据,需完成站点筛选、时间戳生成、宽格式转长格式三个核心操作(以下代码假设CSV第一列为站点IDstation_id,文件名含202301类年月标识,前几列为站点属性,后续为day1到dayN的日雨量列,可根据你的实际格式调整):
library(tidyverse) library(lubridate) process_month_csv <- function(file_path, target_station) { # 读取CSV,关闭列类型提示简化输出 month_data <- read_csv(file_path, show_col_types = FALSE) # 筛选目标站点行,无匹配则返回空表并告警 target_row <- month_data %>% filter(station_id == target_station) if (nrow(target_row) == 0) { warning(paste("站点", target_station, "在文件", basename(file_path), "中未找到")) return(tibble()) } # 从文件名提取年月并转换为日期格式 year_month <- str_extract(basename(file_path), "\\d{6}") %>% ymd() # 拆分站点属性与日雨量数据,将宽格式雨量转为长格式 station_attr <- target_row %>% select(station_id, lon, lat, elevation) # 按实际列名调整 daily_rain <- target_row %>% select(starts_with("day")) %>% pivot_longer(everything(), names_to = "day_tag", values_to = "rainfall") # 生成完整日期并合并属性与雨量数据 daily_rain %>% mutate(day_num = as.integer(str_remove(day_tag, "day")), date = year_month + days(day_num - 1)) %>% select(-day_tag, -day_num) %>% bind_cols(station_attr) }
3. 批量处理并合并结果
指定目标站点ID,批量处理所有CSV后按日期排序:
# 替换为你需要提取的站点ID target_station_id <- "ST001" # 批量处理所有CSV并合并为最终DataFrame final_rain_df <- map_dfr(csv_files, ~process_month_csv(.x, target_station_id)) # 按日期升序排列 final_rain_df <- final_rain_df %>% arrange(date)
4. 验证结果结构
用glimpse检查最终表的格式,预期包含station_id、经纬度、海拔(可选)、date、rainfall列:
glimpse(final_rain_df)
关键适配提示
- 若文件名年月格式为
2023-01,将str_extract的正则改为"\\d{4}-\\d{2}" - 若日雨量列直接用日期命名(如
2023-01-01),将select(starts_with("day"))替换为select(-station_id, -lon, -lat, -elevation)(排除属性列后剩余均为雨量列) - 若不同CSV中站点属性不一致,建议单独维护一份站点信息表,避免从雨量CSV中提取属性
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

