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

如何用R读取含多维度的概率气象预报GRIB2数据集

用R读取GRIB2概率气象预报文件的问题与解决方案

问题背景

尝试用R读取一份包含以下维度的概率气象预报GRIB2文件:

  • 2个变量
  • 114个预报时效
  • 18个经度、24个纬度
  • 50个集合成员

最初通过Python脚本将GRIB文件转为NetCDF格式后再用R读取,但该方案依赖Python及特定包,无法在便携环境运行。转而尝试用R的terra包直接读取,但无法正确提取所有维度数据,尝试代码如下:

require(terra)

## Isn't it possible to get them automatically ?
lat_prev <- (rev(seq(42.875,48.625,by=0.25)))
lon_prev <- (seq(3.375,7.625,by=0.25))

latlon <- expand.grid(lon=lon_prev, lat=lat_prev)

latlons <- terra::vect(latlon, geom=c('lon','lat'), crs="+proj=longlat")
## Not sure about that...
pts <- project(latlons, "+proj=lcc +lat_0=38.5 +lon_0=262.5 +lat_1=38.5 +lat_2=38.5 +x_0=0 +y_0=0 +R=6371229 +units=m")

grib_data <- terra::rast(destfile_CF)
## gives a data frame of NaN
e1 <- extract(grib_data, pts)

核心疑问:需要提取所有维度数据,但并非所有维度都是空间点(SpatialVector类),应创建何种对象?

解决方案

已找到可行方案,代码如下:

require(terra)
require(dplyr)
require(data.table)
require(stats)

destfile <- "C:/Users/XXX/Documents/Example_file.grb"

## 读取GRIB文件
grib_data <- terra::rast(destfile)
print(grib_data)

## 转换为数据框
df <- as.data.frame(grib_data, xy=TRUE)

## 重命名列:成员(50) × 时间(57) × 变量(2)组合
colNames <- paste(names(grib_data), as.character(time(grib_data)), sep="_")
colnames(df) <- c("lon", "lat", colNames)

## 宽表转长表
df2 <- data.table::melt(as.data.table(df), c("lon", "lat"))

## 拆分变量与时间字段
df2$time_UTC <- sub(".*_", "", df2$variable)    
df2$variable <- sub("_.*", "", df2$variable)   

## 添加集合成员编号
df2 <- df2 %>% group_by(lon, lat, variable, time_UTC) %>% mutate(member=(1:length(value)))

## 转换为多维数组
df_array <- stats::xtabs(value~lon+lat+variable+member+time_UTC, df2, drop=F)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:45:41