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

基于daymetr包匹配指定日期提取站点日均温与日降水量问题

问题

我有一个包含site ID、纬度、经度、日期四列的CSV文件,需要计算各站点对应日期的日均温和日降水量总和,正在使用daymetr包处理。已通过download_daymet_batch函数下载2017年全年气象数据,但编写的筛选代码得到的温度和降水量结果为NaN,求助如何根据指定日期筛选数据并正确计算。

相关数据表格:

sitelatlondate
d2200235.1527-84.039611/8/2017
d2200235.1527-84.039611/1/2017
d2206636.4246-84.466611/15/2017
d2206535.2741-81.51841/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:13:16