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

使用R将ERA5逐小时NetCDF文件聚合为日尺度文件求助

解决ERA5逐小时2m最高气温数据聚合为日尺度的问题

我有1970-2022年全年各月的2m最高气温逐小时NetCDF数据(每月一个文件,包含当月逐24小时数据)。曾尝试直接从CDS下载日尺度聚合后的数据,但因数据量过大失败,尝试的代码如下:

wf_set_key(service = "cds") 
data=c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'variable': 'maximum_2m_temperature_since_previous_post_processing',
'year': [
  '1970', '1971', '1972',
  '1973', '1974', '1975',
  '1976', '1977', '1978',
  '1979', '1980', 
],
'month': [
  '03','04',
  '05', '06',
],
'day': [
  '01', '02', '03',
  '04', '05', '06',
  '07', '08', '09',
  '10', '11', '12',
  '13', '14', '15',
  '16', '17', '18',
  '19', '20', '21',
  '22', '23', '24',
  '25', '26', '27',
  '28', '29', '30','31',
],
'time': [
  '00:00', '01:00', '02:00',
  '03:00', '04:00', '05:00',
  '06:00', '07:00', '08:00',
  '09:00', '10:00', '11:00',
  '12:00', '13:00', '14:00',
  '15:00', '16:00', '17:00',
  '18:00', '19:00', '20:00',
  '21:00', '22:00', '23:00',
],
'area': [
  38, 67, 6,
  99
],
'format': 'netcdf',
 },
 'day_mean'=ct.climate.daily_mean(data,keep_attrs=True)
 if count == 1:
 day_mean_all=day_mean
 else:       
  day_mean_all=ct.cube.concat([day_mean_all, day_mean], dim='time')
  count = count + 1
   return day_mean_all
   'download.nc')

现在尝试用R将逐月逐小时数据聚合为日尺度,但运行代码时报错,代码及报错如下:

library(ncdf4) 
ncpath <- "D:/MAX_TEMP/" 
ncname <- "adaptor.mars.internal-1681202164.1038315-25242-15-2a718a58-dcd5-4470-9fd2-ddbdede30875_march"   
ncfname <- paste(ncpath, ncname, ".nc", sep="") 
ncin <- nc_open(ncfname) 
print(ncin) 
library(dplyr) 
a1<-ncname %>%
  group_by(time) %>%
    summarize(Mean_Max_Temp = mean(expver))
# Error in UseMethod("group_by")

错误分析

  • ncname是字符串类型的文件名,不是可处理的数据集对象,无法直接使用dplyr的group_by函数
  • 未正确读取NetCDF文件中的气温变量和时间变量,错误地对expver(ERA5的实验版本变量)求平均,这不是目标气温数据
  • 未将时间变量转换为可分组的日期格式

正确处理方案

方案1:单站点/一维时间序列数据处理

library(ncdf4)
library(dplyr)
library(lubridate)

# 读取NetCDF文件
ncpath <- "D:/MAX_TEMP/" 
ncname <- "adaptor.mars.internal-1681202164.1038315-25242-15-2a718a58-dcd5-4470-9fd2-ddbdede30875_march"   
ncfname <- paste(ncpath, ncname, ".nc", sep="") 
ncin <- nc_open(ncfname)

# 提取目标变量:替换为你文件中的2m最高气温变量名,可通过print(ncin)查看
max_t2m <- ncvar_get(ncin, varid = "maximum_2m_temperature_since_previous_post_processing")
# 提取时间变量并转换为日期时间格式(ERA5时间为1970-01-01以来的小时数)
time_hours <- ncvar_get(ncin, varid = "time")
datetime <- as.POSIXct(time_hours * 3600, origin = "1970-01-01", tz = "UTC")

# 关闭文件连接
nc_close(ncin)

# 整理为数据框并按日期聚合
df <- data.frame(
  datetime = datetime,
  max_temp = as.vector(max_t2m)
)

# 按日期分组计算日最高温(如需日平均替换为mean(max_temp, na.rm = TRUE))
daily_data <- df %>%
  mutate(date = as.Date(datetime)) %>%
  group_by(date) %>%
  summarize(daily_max_temp = max(max_temp, na.rm = TRUE))

# 查看结果
print(daily_data)

方案2:空间网格数据高效处理

如果你的数据是多经纬度的网格数据,使用stars包更便捷,支持直接对网格数据做时间聚合:

library(stars)

# 读取NetCDF文件
nc_data <- read_stars("D:/MAX_TEMP/adaptor.mars.internal-1681202164.1038315-25242-15-2a718a58-dcd5-4470-9fd2-ddbdede30875_march.nc")

# 按日期聚合,计算日最高温(如需日平均替换为mean)
daily_grid <- aggregate(nc_data, by = "date", FUN = max, na.rm = TRUE)

# 保存聚合后的日尺度数据为新NetCDF文件
write_stars(daily_grid, "D:/MAX_TEMP/daily_max_temp_march.nc")

批量处理提示

若要处理1970-2022所有月份的文件,可通过list.files遍历文件夹中的所有NetCDF文件,循环处理后合并结果:

# 示例批量处理框架
file_list <- list.files("D:/MAX_TEMP/", pattern = ".nc$", full.names = TRUE)
daily_list <- list()

for (i in seq_along(file_list)) {
  nc <- read_stars(file_list[i])
  daily <- aggregate(nc, by = "date", FUN = max, na.rm = TRUE)
  daily_list[[i]] <- daily
}

# 合并所有文件的日尺度数据
all_daily <- do.call(c, daily_list)
write_stars(all_daily, "D:/MAX_TEMP/all_daily_max_temp.nc")

内容的提问来源于stack exchange,提问作者shravani banerjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:34:59