将HadUK-Grid(NetCDF)文件导入R并转为DataFrame的技术问题
解决HadUK-Grid逐日区域最低气温数据处理问题
一、修正时间变量转换
你当前用nc.get.time.series得到的时间截止到2021年11月,大概率是函数参数适配问题。直接用ncdf4包原生方法结合日期转换函数处理更可靠:
# 读取时间变量原始数值 time_raw <- ncvar_get(nc, "time") # 获取时间变量的属性信息 time_units <- ncatt_get(nc, "time", "units")$value time_calendar <- ncatt_get(nc, "time", "calendar")$value # 转换为Date类型(逐日数据无需保留时分秒) time_dates <- as.POSIXct(time_raw * 3600, origin = "1800-01-01 00:00:00", tz = "UTC") time_dates <- as.Date(time_dates)
执行tail(time_dates)验证,就能看到2021年12月的日期。
二、转换为可用的逐日区域气温DataFrame
HadUK-Grid的区域尺度tasmin是二维数组(维度:geo_region × time),用tidyverse工具可快速转成规整的长格式DataFrame:
library(tidyverse) # 将温度数组转为数据框,行对应区域、列对应时间点 temp_df <- as.data.frame(temp) # 给列名赋值为对应的日期 colnames(temp_df) <- time_dates # 整理成长格式:每行对应一条「区域-日期-气温」记录 temp_df <- temp_df %>% mutate(geo_region = region) %>% pivot_longer(cols = -geo_region, names_to = "date", values_to = "tasmin") %>% mutate(date = as.Date(date)) # 查看结果 head(temp_df)
如果偏好基础R工具,用reshape2也能实现:
library(reshape2) # 融化数组为长格式 temp_df <- melt(temp, varnames = c("geo_region", "time"), value.name = "tasmin") # 匹配日期和区域名称 temp_df$date <- time_dates[temp_df$time] temp_df$geo_region <- region[temp_df$geo_region] # 移除冗余的time列 temp_df <- temp_df[, c("geo_region", "date", "tasmin")]
补充提示
- 可通过
ncatt_get(nc, "tasmin", "units")确认气温单位(HadUK-Grid默认是摄氏度); - 数据处理完成后记得关闭nc文件:
nc_close(nc)
内容的提问来源于stack exchange,提问作者Megang
相关产品推荐
相关产品推荐

