以R为单位的netCDF文件的月平均值

以R为单位的netCDF文件的月平均值,r,netcdf4,R,Netcdf4,我有一个netCDF文件(.nc),其中包含16年(1998-2014)的每日降水量(5844层)。这三个维度分别是时间(尺寸5844)、纬度(尺寸19)和经度(尺寸20) 在R中是否有一种简单的方法来计算每个光栅单元: 月平均值和年平均值 累积比较(例如,1-3月与所有1-3月的平均值进行比较) 到目前为止,我已经: library(ncdf4) library(raster) Rname <- 'F:/extracted_rain.nc' rainfall <- nc_op

我有一个netCDF文件(.nc),其中包含16年(1998-2014)的每日降水量(5844层)。这三个维度分别是时间(尺寸5844)、纬度(尺寸19)和经度(尺寸20) 在R中是否有一种简单的方法来计算每个光栅单元:

  • 月平均值和年平均值
  • 累积比较(例如,1-3月与所有1-3月的平均值进行比较)
到目前为止,我已经:

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
希望我能把问题说清楚,如果能朝着正确的方向迈出第一步,我将不胜感激。
示例数据

以下是使用
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') 
然后,根据您是希望输出为矢量/矩阵/数据帧还是希望保持光栅格式,您可以在使用
getValues
检索单元格值后对其应用该函数,或者使用
graster
-包中的
calc
-函数创建光栅输出(这将是一个光栅堆栈,其层数与数据中的层数相同)


v这个问题需要在R中找到解决方案,但是如果有人想完成这个任务,并且想要一个简单的替代命令行解决方案,那么这些统计数据就是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

如果您想要一个特定的月份,只需选择使用selmon或seldate即可。

我认为最容易转换为光栅砖,然后转换为data.frame


然后可以使用通用代码DF$Weeklyman非常轻松地提取统计数据。我发现示例nc文件的维度与您在问题中提到的不同。您能上传一个更好的示例数据(与您在问题中提到的维度完全相同)吗你是对的,我假设只花几天时间,尺寸就不会改变。由于原始文件不太大,我提供了新的样本数据!感谢@raymkchowI建议将数据转换为
xts
类,并使用函数
apply.monthly
apply.year
进行计算。但是bably@joberlin的方法更好,因为它使用rasterstack。似乎你想以错误的方式访问堆栈层。要获得堆栈对象的第190层,请执行以下操作:堆栈对象[[190]]如果数据是每小时观察值,而我们需要每日平均值,该怎么办?我尝试将每月平均值堆栈的第3行更改为
out
cdo yearmean in.nc yearmean.nc
cdo ymonmean in.nc ymonmean.nc
cdo sub monmean.nc ymonmean.nc monanom.nc