从 NETCDF R 生成时间序列向量(空间平均)
Generate timeseries vector (spatial average) from NETCDF R
我有一个 NETCDF 文件,其属性为经度、纬度、时间、降水量。数据覆盖一定的空间域。是1960年到2100年的每日数据。
1) 我想从主域
中对数据进行空间子集化(例如 lat[45,50] 和 lon[-78,-85])
2) 从子集中,我想对所有网格进行平均并生成单列每日时间序列,然后将其写入 .csv 文件。
注意:我的数据包含缺失值
按照这些思路应该可以工作
library(raster)
b <- brick('file.nc')
be <- crop(b, extent(-85, -78, 45, 50))
a <- aggregate(be, dim(be)[2:1], na.rm=TRUE)
v <- values(a)
write.csv(v, 'precip.csv', row.names=FALSE)
通常,获取日期也是如此:
date <- getZ(be)
或
date <- names(a)
date <- gsub('X', '', date)
然后
v <- data.frame(date=date, prec=v)
write.csv(v, 'precip.csv', row.names=FALSE)
这个日期是否可读取决于它在 ncdf 文件中的存储方式(即是否遵循某些约定)。
这会进行切割和平均,但会将答案写入另一个 netcdf。如果您确实需要 CSV,则需要使用上述解决方案的那一部分。
cdo fldmean -sellonlatbox,-85,-78,45,50 in.nc out.nc
library (ncdf4)
nc <- nc_open("netcdf.nc")
lon <- ncvar_get(nc,"lon")
lat <- ncvar_get(nc,"lat")
time <- ncvar_get(nc,"time")
lon_lim <- c(45,50)
lat_lim <- c(-78,-85)
lon_ind <- which(lon >= lon_lim[1] & lon <= lon_lim[2])
lat_ind <- which(lat >= lat_lim[1] & lat <= lat_lim[2])
precip <- ncvar_get(nc,"precip",start = c(lon_ind[1],lat_ind[1],time),count = c(length(lon_ind),length(lat_ind),length(time)))
ts <- apply(precip,3,mean,na.rm=TRUE)
我有一个 NETCDF 文件,其属性为经度、纬度、时间、降水量。数据覆盖一定的空间域。是1960年到2100年的每日数据。
1) 我想从主域
中对数据进行空间子集化(例如 lat[45,50] 和 lon[-78,-85])2) 从子集中,我想对所有网格进行平均并生成单列每日时间序列,然后将其写入 .csv 文件。
注意:我的数据包含缺失值
按照这些思路应该可以工作
library(raster)
b <- brick('file.nc')
be <- crop(b, extent(-85, -78, 45, 50))
a <- aggregate(be, dim(be)[2:1], na.rm=TRUE)
v <- values(a)
write.csv(v, 'precip.csv', row.names=FALSE)
通常,获取日期也是如此:
date <- getZ(be)
或
date <- names(a)
date <- gsub('X', '', date)
然后
v <- data.frame(date=date, prec=v)
write.csv(v, 'precip.csv', row.names=FALSE)
这个日期是否可读取决于它在 ncdf 文件中的存储方式(即是否遵循某些约定)。
这会进行切割和平均,但会将答案写入另一个 netcdf。如果您确实需要 CSV,则需要使用上述解决方案的那一部分。
cdo fldmean -sellonlatbox,-85,-78,45,50 in.nc out.nc
library (ncdf4)
nc <- nc_open("netcdf.nc")
lon <- ncvar_get(nc,"lon")
lat <- ncvar_get(nc,"lat")
time <- ncvar_get(nc,"time")
lon_lim <- c(45,50)
lat_lim <- c(-78,-85)
lon_ind <- which(lon >= lon_lim[1] & lon <= lon_lim[2])
lat_ind <- which(lat >= lat_lim[1] & lat <= lat_lim[2])
precip <- ncvar_get(nc,"precip",start = c(lon_ind[1],lat_ind[1],time),count = c(length(lon_ind),length(lat_ind),length(time)))
ts <- apply(precip,3,mean,na.rm=TRUE)