咨询.gbl文件的内容构成及R环境下处理与生成相关问题
NOAA .gbl 文件结构解析与R环境生成方案
一、.gbl 文件核心结构
.gbl 是NOAA为HYSPLIT大气轨迹模型定义的ASCII文本格式地面气象数据文件,用于驱动轨迹计算。结构分为固定格式的文件头和逐行记录的气象数据块:
1. 文件头(固定8行)
每行包含16个用空格分隔的数值,核心信息集中在前3行:
第一行:起始时间(年、月、日、时、分、秒,后10位为预留0)
第三行:第一个数为包含的气象变量总数,第二个数为数据类型(1代表地面数据)
其余行:预留填充0即可
示例标准头:
1990 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注:第三行的4代表包含4个气象变量(比如气压、气温、风速、风向)
2. 数据行
每行对应一个时间点的单站点/网格气象数据,格式为空格分隔的固定字段:YYYYMMDDHH 纬度 经度 气象变量1 气象变量2 ...
示例数据行:
1990010100 -90.00 0.00 1013.25 263.15 2.5 180.0
字段说明:
- 时间:格式为
YYYYMMDDHH(年、月、日、时) - 纬度/经度:保留2位小数
- 气象变量:按文件头定义的顺序排列,比如气压(hPa)、气温(K)、风速(m/s)、风向(°)
二、R环境下自行生成.gbl 文件步骤
1. 准备气象数据
确保你的数据集包含:
- 逐小时时间序列(与.gbl的时间粒度匹配)
- 站点/网格的经纬度坐标
- 所需气象变量(需与文件头定义的变量数对应)
2. 构建文件头
用R的字符向量生成符合格式的8行头信息:
# 示例:起始时间1990年1月1日,包含4个地面气象变量 header <- c( "1990 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", " 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", rep(" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", 5) )
3. 格式化数据行
将原始数据转换为.gbl要求的格式,注意数值的小数位数和字段顺序:
library(dplyr) # 假设原始数据框为met_data,包含datetime, latitude, longitude, pressure, temp_k, wind_speed, wind_dir formatted_data <- met_data %>% mutate( time_str = format(datetime, "%Y%m%d%H"), lat = sprintf("%6.2f", latitude), lon = sprintf("%6.2f", longitude), pres = sprintf("%7.2f", pressure), temp = sprintf("%6.2f", temp_k), wind_spd = sprintf("%5.1f", wind_speed), wind_dir = sprintf("%5.1f", wind_dir) ) %>% select(time_str, lat, lon, pres, temp, wind_spd, wind_dir) %>% apply(1, paste, collapse = " ")
4. 写入.gbl 文件
将文件头和格式化数据合并写入文件:
# 先写入文件头 writeLines(header, "custom_met.gbl") # 追加数据行 write.table(formatted_data, "custom_met.gbl", append = TRUE, row.names = FALSE, col.names = FALSE, quote = FALSE)
5. 用purrr::walk()批量生成
如果需要按时间分段(如按年)批量生成文件,用purrr::walk()实现循环:
library(purrr) library(lubridate) # 按年份拆分数据,year_list为目标年份向量 year_list <- c(1990, 1991, 1992) walk(year_list, function(target_year) { # 筛选对应年份的数据 year_subset <- met_data %>% filter(year(datetime) == target_year) # 生成对应年份的文件头 year_header <- c( sprintf("%d 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0", target_year), " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", " 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", rep(" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", 5) ) # 格式化年份数据 formatted_year <- year_subset %>% mutate( time_str = format(datetime, "%Y%m%d%H"), lat = sprintf("%6.2f", latitude), lon = sprintf("%6.2f", longitude), pres = sprintf("%7.2f", pressure), temp = sprintf("%6.2f", temp_k), wind_spd = sprintf("%5.1f", wind_speed), wind_dir = sprintf("%5.1f", wind_dir) ) %>% select(time_str, lat, lon, pres, temp, wind_spd, wind_dir) %>% apply(1, paste, collapse = " ") # 写入对应年份的.gbl文件 file_name <- sprintf("custom_met_%d.gbl", target_year) writeLines(year_header, file_name) write.table(formatted_year, file_name, append = TRUE, row.names = FALSE, col.names = FALSE, quote = FALSE) })
内容的提问来源于stack exchange,提问作者eeeeessss
相关产品推荐
相关产品推荐

