ITPub博客

首页 > > > 【R语言】2020美赛A题海平面温度数据读取与筛选

【R语言】2020美赛A题海平面温度数据读取与筛选

作者:浪花小雨滴 时间:2020-06-17 10:46:35 0 删除 编辑

竞赛结束了,可以分享了。本文也适合 .nc 数据的读取。

使用 Google 搜索不难找到数据网站:

Met Office Hadley Centre observations datasets​www.metoffice.gov.uk

下载数据 HadISST_sst.nc.gz(~212Mb),解压后是 400 多兆的 .nc 文件:

因为我比较喜欢 R语言,就继续使用 Google 搜索,R 语言读取 .nc 数据(英文),很快就找到一个包:ncdf4.

查阅到该包的文档,相关文章备用,比如找到这篇:

http://geog.uoregon.edu/bartlein/courses/geog607/Rmd/netCDF_01.htm​geog.uoregon.edu

不过这篇文章有点旧,并不适合新版本包,基本上函数和参数都是不对的,但对照包文档使用仍会提供有用的信息。

开始调试(都是思考+摸索尝试发现的):

# install.packages("ncdf4")
library(ncdf4)

ncin <- nc_open("HadISST_sst.nc")    # 读取.nc数据
print(ncin)                          # 看看数据总体信息
lon = ncvar_get(ncin, "longitude")    # 经度
lat = ncvar_get(ncin, "latitude")     # 纬度

默认缺失值有必要提取出来会用到,汇总信息里也能看到它。

fillval <-  ncatt_get(ncin, "sst", "_FillValue")   # 查看默认缺失值
fillval
ncatt_get(ncin, "sst", "units")                    # 查看温度单位


查看时间单位:

ncatt_get(ncin, "time", "units")    # 查看时间单位

这说明时间为从 1870-1-1 开始的天数。

获取时间:

t <- ncvar_get(ncin, "time")

将时间转化为正确的日期方便绘图,实际上如果后续建模想让时间作为自变量,还得用天数。

library(lubridate)

start <- ymd("1870-01-01")
t <- start + t            

重点来了,提取并操作温度数据:

temps <- ncvar_get(ncin, "sst")     # 温度数据
dim(temps)                          

可见,温度数据是大小为 360 × 180 × 1800 的 3 维数组,三个维度分别代表:经度、纬度、日期。

接着需要将数据中的默认缺失值(-1e+30)替换成 R 中的缺失值 NA:

temps[temps == fillval$value] <- NA

然后,就是筛选数据:从经纬度来说,只需要苏格兰渔业范围内的,去能从地图上拾取经纬度的网站,选取范围点(我随便大致取的);从时间上来说,比如只想要 1950 年 至今的。

先定义筛选索引:

lon_inds <- which(-18 < lon & lon < 5)
lat_inds <- which(52 < lat & lat < 65)
t_inds <- which(t > ymd("1950-01-01"))

用索引筛选数据:

Adats <- temps[lon_inds, lat_inds, t_inds]
dim(Adats)

这下数据集小多了。

为了方便对应地取用温度数据,把经纬度也都提取出来:

lons <- lon[lon_inds]
lats <- lat[lat_inds]
ts <- t[t_inds]

比如,想查看第 2 个经度(-16.5),第 3 个纬度(62.5),2018 年至今的温度:

ts_ind <- which(ts > ymd("2018-1-1"))
Adats[2, 3, ts_ind]

数据都准备好了,保存出来后续使用,筛选出来的温度、经度、纬度、时间四个数据就够了:

save(Adats, lons, lats, ts, file="Atemps.Rda")

大小只有 900 多 k,下次使用,直接载入就好了:

load("Atemps.Rda")


总结:以上从不知道怎么办到解决,也就大概一个小时的时间。数学建模比赛遇到的都是新问题,所以建议大家要学会和锻炼:搜索资料,快速学习并解决遇到的问题。


原创作品,转载请注明。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3170700/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39941