基于daymetr包匹配指定日期提取站点日均温与日降水量问题
问题
我有一个包含site ID、纬度、经度、日期四列的CSV文件,需要计算各站点对应日期的日均温和日降水量总和,正在使用daymetr包处理。已通过download_daymet_batch函数下载2017年全年气象数据,但编写的筛选代码得到的温度和降水量结果为NaN,求助如何根据指定日期筛选数据并正确计算。
相关数据表格:
| site | lat | lon | date |
|---|---|---|---|
| d22002 | 35.1527 | -84.0396 | 11/8/2017 |
| d22002 | 35.1527 | -84.0396 | 11/1/2017 |
| d22066 | 36.4246 | -84.4666 | 11/15/2017 |
| d22065 | 35.2741 | -81.5184 | 1/22/2017 |
下载数据代码:
library(daymetr) site_weather2017 <- download_daymet_batch( file_location = "templateforweatherdata.csv", start = 2017, end = 2017, internal = TRUE, force = FALSE, silent = FALSE, path = tempdir(), simplify = FALSE )
尝试的筛选计算代码:
finaldata <- list() for( i in 1:length(site_weather2017)){ site <- site_weather2017[[i]] site.dat <- site$data #add a column of mean daily temperature site.dat["tmean"] <- rowMeans(site.dat[,c("tmax..deg.c.","tmin..deg.c.")]) #choose timespan of interest beginDate <- yday(as.Date(format="%m-%d-%Y")) # s.Date(alldata$Date, format = "%Y-%m-%d") #subset to only timespan of interest subSite <- subset(site.dat, yday %in% beginDate:beginDate) subSite['precip'] <- subSite$prcp..mm.day. #calculate mean daily temperature, and sum of precipitation finaldata[[i]] <- data.frame(site=site$site, meanTemp=mean(subSite$tmean), sumPrecip=base::sum(subSite$prcp..mm.day.)) }
解决方案
原代码的核心问题:
beginDate计算完全无效:as.Date(format="%m-%d-%Y")未传入具体日期字符串,也未关联每个站点的目标日期,导致筛选结果为空数据框,最终mean和sum返回NaN。- 未读取原始CSV中的目标日期,无法为每个站点匹配对应的筛选日期。
- 循环逻辑未绑定站点与目标日期的对应关系。
以下是修正后的完整代码:
library(daymetr) library(dplyr) library(lubridate) # 1. 读取原始站点目标日期数据 site_target_dates <- read.csv("templateforweatherdata.csv", stringsAsFactors = FALSE) # 2. 下载Daymet数据(保留原有逻辑) site_weather2017 <- download_daymet_batch( file_location = "templateforweatherdata.csv", start = 2017, end = 2017, internal = TRUE, force = FALSE, silent = FALSE, path = tempdir(), simplify = FALSE ) # 3. 批量处理站点数据,匹配目标日期计算指标 finaldata <- list() for(i in 1:length(site_weather2017)){ # 获取当前站点的Daymet数据与站点ID current_site <- site_weather2017[[i]] site_id <- current_site$site daymet_dat <- current_site$data # 计算日均温(加入na.rm避免单个NaN影响结果) daymet_dat$tmean <- rowMeans(daymet_dat[, c("tmax..deg.c.", "tmin..deg.c.")], na.rm = TRUE) # 从原始数据中提取当前站点的所有目标日期,转换为Date格式 target_dates <- site_target_dates %>% filter(site == site_id) %>% pull(date) %>% mdy() # 匹配原始日期格式(月/日/年) # 转换为年积日,匹配Daymet数据中的yday列 target_yday <- yday(target_dates) # 筛选目标日期的气象数据 subSite <- daymet_dat %>% filter(yday %in% target_yday) # 按日期分组计算日均温与降水量总和 site_results <- subSite %>% group_by(yday) %>% summarise( meanTemp = mean(tmean, na.rm = TRUE), sumPrecip = sum(prcp..mm.day., na.rm = TRUE) ) %>% mutate( site = site_id, date = as.Date(paste(2017, yday), format = "%Y %j") # 转换回标准日期格式 ) %>% select(site, date, meanTemp, sumPrecip) finaldata[[i]] <- site_results } # 合并所有站点结果为单个数据框 final_df <- bind_rows(finaldata) print(final_df)
关键修正说明:
- 读取原始CSV数据,为每个站点绑定对应的目标日期,确保筛选逻辑准确。
- 使用
lubridate包的mdy()函数正确解析原始日期,提取年积日与Daymet数据匹配。 - 加入
na.rm = TRUE参数,避免数据中存在NaN导致整体计算结果失效。 - 支持单个站点多个目标日期的场景,分组计算后保留日期信息,结果更直观。
- 最终合并所有结果为一个数据框,便于后续分析或导出。
内容的提问来源于stack exchange,提问作者J Elliott
相关产品推荐
相关产品推荐

