R 中 netCDF 文件的月平均值
Monthly average from netCDF files in R
我有一个 netCDF 文件 (.nc),其中包含 16 年 (1998 - 2014) 的每日降水量(5844 层)。 3个维度是时间(尺寸5844),纬度(尺寸19)和经度(尺寸20)
R 中是否有一种直接的方法来计算每个栅格单元:
- 月平均和年平均
- 累积比较(例如 jan-mar 与所有 jan-mar 的平均值相比)
到目前为止我有:
library(ncdf4)
library(raster)
Rname <- 'F:/extracted_rain.nc'
rainfall <- nc_open(Rname)
readRainfall <- ncvar_get(rainfall, "rain") #"rain" is float name
raster_rainfall <- raster(Rname, varname = "rain") # also tried brick()
asdatadates <- as.Date(rainfall$dim$time$vals/24, origin='1998-01-01') #The time interval is per 24 hours
我的第一个挑战是计算每个栅格像元的月平均值。我不确定如何在牢记最终目标(累积比较)的同时最好地进行。如何轻松访问某个月的几天?
raster(readRainfall[,,500])) # doesn't seem like a straightforward approach
希望我把我的问题说清楚了,如果你第一次朝着正确的方向前进,我们将不胜感激。
示例数据 here
这是使用 zoo
-包的一种方法:
### first read the data
library(ncdf4)
library(raster)
library(zoo)
### use stack() instead of raster
stack_rainfall <- stack(Rname, varname = "rain")
### i renamed your "asdatadates" object for simplicity
dates <- as.Date(rainfall$dim$time$vals/24, origin='1998-01-01')
在您的示例数据集中,您只有 18 个图层,全部来自 1998 年 1 月。但是,以下内容也应该适用于更多图层(几个月)。
首先,我们将构建一个函数来操作一个值向量(即像素时间序列)以使用 dates
将输入转换为 zoo
对象并使用 aggregate
计算平均值。函数 returns 一个向量,其长度等于 dates
.
中的月数
monthly_mean_stack <- function(x) {
require(zoo)
pixel.ts <- zoo(x, dates)
out <- as.numeric(aggregate(pixel.ts, as.yearmon, mean, na.rm=TRUE))
out[is.nan(out)] <- NA
return(out)
}
然后,根据您是希望输出为矢量/矩阵/数据框还是希望保留栅格格式,您可以在使用 getValues
,或使用 raster
包中的 calc
函数创建栅格输出(这将是一个栅格堆栈,层数与数据中的月份一样多)
v <- getValues(stack_rainfall) # every row displays one pixel (-time series)
# this should give you a matrix with ncol = number of months and nrow = number of pixel
means_matrix <- t(apply(v, 1, monthly_mean_stack))
means_stack <- calc(stack_rainfall, monthly_mean_stack)
当您处理大型栅格数据集时,您还可以使用 clusterR
函数并行应用您的函数。看到 ?clusterR
该问题要求在 R 中提供解决方案,但如果有人希望完成此任务并想要一个简单的替代方案 command-line,这些统计数据是 CDO 的基础
每月平均值:
cdo monmean in.nc monmean.nc
年平均数:
cdo yearmean in.nc yearmean.nc
计算所有 1 月、2 月等的平均值:
cdo ymonmean in.nc ymonmean.nc
相对于长期年周期的月异常:
cdo sub monmean.nc ymonmean.nc monanom.nc
然后你想要一个特定的月份,只需 select 与 selmon 或 seldate。
您可以使用系统命令从 R 中调用这些函数。
我认为最容易转换为光栅砖然后转换为 data.frame。
然后可以使用通用代码 DF$weeklymean <- rowMeans(DF[ ])
轻松提取统计数据
我有一个 netCDF 文件 (.nc),其中包含 16 年 (1998 - 2014) 的每日降水量(5844 层)。 3个维度是时间(尺寸5844),纬度(尺寸19)和经度(尺寸20) R 中是否有一种直接的方法来计算每个栅格单元:
- 月平均和年平均
- 累积比较(例如 jan-mar 与所有 jan-mar 的平均值相比)
到目前为止我有:
library(ncdf4)
library(raster)
Rname <- 'F:/extracted_rain.nc'
rainfall <- nc_open(Rname)
readRainfall <- ncvar_get(rainfall, "rain") #"rain" is float name
raster_rainfall <- raster(Rname, varname = "rain") # also tried brick()
asdatadates <- as.Date(rainfall$dim$time$vals/24, origin='1998-01-01') #The time interval is per 24 hours
我的第一个挑战是计算每个栅格像元的月平均值。我不确定如何在牢记最终目标(累积比较)的同时最好地进行。如何轻松访问某个月的几天?
raster(readRainfall[,,500])) # doesn't seem like a straightforward approach
希望我把我的问题说清楚了,如果你第一次朝着正确的方向前进,我们将不胜感激。 示例数据 here
这是使用 zoo
-包的一种方法:
### first read the data
library(ncdf4)
library(raster)
library(zoo)
### use stack() instead of raster
stack_rainfall <- stack(Rname, varname = "rain")
### i renamed your "asdatadates" object for simplicity
dates <- as.Date(rainfall$dim$time$vals/24, origin='1998-01-01')
在您的示例数据集中,您只有 18 个图层,全部来自 1998 年 1 月。但是,以下内容也应该适用于更多图层(几个月)。
首先,我们将构建一个函数来操作一个值向量(即像素时间序列)以使用 dates
将输入转换为 zoo
对象并使用 aggregate
计算平均值。函数 returns 一个向量,其长度等于 dates
.
monthly_mean_stack <- function(x) {
require(zoo)
pixel.ts <- zoo(x, dates)
out <- as.numeric(aggregate(pixel.ts, as.yearmon, mean, na.rm=TRUE))
out[is.nan(out)] <- NA
return(out)
}
然后,根据您是希望输出为矢量/矩阵/数据框还是希望保留栅格格式,您可以在使用 getValues
,或使用 raster
包中的 calc
函数创建栅格输出(这将是一个栅格堆栈,层数与数据中的月份一样多)
v <- getValues(stack_rainfall) # every row displays one pixel (-time series)
# this should give you a matrix with ncol = number of months and nrow = number of pixel
means_matrix <- t(apply(v, 1, monthly_mean_stack))
means_stack <- calc(stack_rainfall, monthly_mean_stack)
当您处理大型栅格数据集时,您还可以使用 clusterR
函数并行应用您的函数。看到 ?clusterR
该问题要求在 R 中提供解决方案,但如果有人希望完成此任务并想要一个简单的替代方案 command-line,这些统计数据是 CDO 的基础
每月平均值:
cdo monmean in.nc monmean.nc
年平均数:
cdo yearmean in.nc yearmean.nc
计算所有 1 月、2 月等的平均值:
cdo ymonmean in.nc ymonmean.nc
相对于长期年周期的月异常:
cdo sub monmean.nc ymonmean.nc monanom.nc
然后你想要一个特定的月份,只需 select 与 selmon 或 seldate。
您可以使用系统命令从 R 中调用这些函数。
我认为最容易转换为光栅砖然后转换为 data.frame。
然后可以使用通用代码 DF$weeklymean <- rowMeans(DF[ ])
轻松提取统计数据