如何在R中基于模式匹配输出生成连续时序数据及气象数据匹配问题
Hey there! Let's tackle your two questions step by step—first the R time series task, then some ideas for your spatial data matching situation.
1. 在R中从批量匹配文件生成连续时间序列数据
Here's a practical, step-by-step workflow to turn your pattern-matched files into a clean, continuous time series:
Step 1: 获取所有匹配的文件
用list.files()定位符合特定命名规则的文件。比如如果你的文件命名类似germany_weather_20200101.csv,可以这样设置匹配规则:
# 替换为你的实际文件路径和匹配模式 file_list <- list.files( path = "path/to/German historical data", pattern = "^germany_weather_\\d{8}\\.csv$", # 匹配文件名中的8位日期格式 full.names = TRUE # 获取完整文件路径而非仅文件名 )
Step 2: 按日期排序文件
为了保证时间序列的顺序,从文件名中提取日期并对文件列表排序:
library(stringr) library(dplyr) # 从文件路径中提取日期字符串并转换为Date对象 file_dates <- str_extract(file_list, "\\d{8}") %>% as.Date(format = "%Y%m%d") # 按时间顺序排序文件 sorted_files <- file_list[order(file_dates)]
Step 3: 批量读取并合并数据
用purrr::map_dfr一次性读取所有文件并合并为单个数据框,同时添加date列标记每行数据对应的日期:
library(purrr) # 定义读取单个文件并添加日期元数据的函数 read_weather <- function(file_path) { date_str <- str_extract(file_path, "\\d{8}") weather_data <- read.csv(file_path) weather_data$observation_date <- as.Date(date_str, format = "%Y%m%d") return(weather_data) } # 批量处理所有已排序的文件 combined_weather <- map_dfr(sorted_files, read_weather)
Step 4: 补全缺失日期生成连续时间序列
如果存在日期缺失,用tidyr::complete补全 gaps(如果有多个气象站,按站点分组处理):
library(tidyr) # 为每个气象站生成连续的日期序列 continuous_ts <- combined_weather %>% group_by(Stationsname) %>% # 按气象站名称分组 complete(observation_date = seq(min(observation_date), max(observation_date), by = "day")) %>% ungroup()
2. 气象站与区级多边形匹配的后续思路
既然你的Stationsname和NAME_2字段完全一致,这就有了一个直接的关联键。以下是常见的后续处理方向:
选项1:关联气象数据与空间属性
将清洗后的气象数据与投影CSV合并,为每个气象观测记录添加区级属性(比如面积、人口等):
# 读取投影数据CSV projected_stations <- read.csv("Projected Data/your_projected_file.csv") # 通过匹配名称字段合并数据 weather_with_district <- left_join( combined_weather, projected_stations, by = c("Stationsname" = "NAME_2") # 用气象站名称匹配区级名称 )
选项2:空间准确性验证(可选)
即使名称匹配,也建议验证每个气象站是否确实位于对应的区级多边形内。用sf包做空间验证:
library(sf) # 读取原始区级shapefile(如果还保留的话) districts_sf <- st_read("path/to/german_districts.shp") # 将投影后的气象站数据转换为空间对象 stations_sf <- st_as_sf( projected_stations, coords = c("lon", "lat"), # 替换为你的坐标列名称 crs = st_crs(districts_sf) # 与区级shapefile的坐标系保持一致 ) # 空间关联气象站与所属区级多边形 spatial_validation <- st_join(stations_sf, districts_sf, join = st_within)
如果你有具体的后续任务(比如按区级聚合气象数据、补全缺失的空间属性等),可以补充更多细节哦!
内容的提问来源于stack exchange,提问作者Jerry07

