当前位置: 首页 > 知识库问答 >
问题:

R中netCDF文件的月平均值

欧阳俊捷
2023-03-14

我有一个netCDF文件(. nc),其中包含16年(1998-2014年)的日降水量(5844层)。3个维度是时间(大小5844)、纬度(大小19)和经度(大小20)R中是否有一种简单的方法来计算每个rastercell:

    < li >每月

到目前为止,我已经:

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

希望我能把我的问题说清楚,如果能朝着正确的方向迈出第一步,我将不胜感激。此处为示例数据

共有3个答案

郎鸿雪
2023-03-14

我认为最简单的方法是转换为栅格砖,然后转换为data.frame。

然后可以使用通用代码DF$weeklymean非常轻松地提取统计信息

江煜
2023-03-14

下面是使用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月。但是,以下内容也应该适用于更多的图层(月)。首先,我们将构建一个函数,该函数操作一个值向量(即像素时间序列),使用日期将输入转换为zoo对象,并使用聚合计算平均值。该函数返回一个向量,其长度等于日期中的月数。

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)
}

然后,根据您希望输出是矢量/矩阵/数据框还是希望保持栅格格式,您可以在使用 getValue 检索像元值后将函数应用于像元值,或者使用栅格包中的 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 函数并行应用函数。看?集群R

楚宏胜
2023-03-14

这个问题需要一个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进行选择。

可以使用 system 命令从 R 调用这些函数。

 类似资料:
  • 我有一个来自ERA5的2m温度netcdf文件,从2000年到2019年,从04月到10月,总共有13680个时间步长和61x161个纬度。我想分别计算每年所有每日时间步长的月平均值。例如,我们将获得2000年4月、2000年5月等数据的月平均值。我用xarray resample尝试了下面的代码,但是出现了两个问题。 出于某种原因,多年来,中庸之道似乎都是如此 重采样函数创建01、02、03、1

  • 我有一个数据帧,其中的行与name列重复,但与value列不重复: 我需要将重复的名称聚合到一行中,同时计算值列的平均值。预期产出如下: 我已经尝试使用< code>df[duplicated(df$name),],但是这当然不能说明重复的含义。我想使用< code>aggregate(),但问题是这个函数有趣的部分也适用于所有其他列,而且在其他问题中,它不能计算char内容。由于所有其他列在“副

  • 问题内容: 我有一张表,如下所示: 我从中创建以下视图: 现在,当我想创建每月计数以了解如何将每日总和除以得出平均列a(即特定月份中的天数)时,就会出现问题。 我知道要在PostgreSQL中获得成功,您可以: 但是我不能使用,我必须以某种方式让它知道分组完成的月份。任何建议,即什么应该取代 ??? 在此视图中: 问题答案: 更快,更短一点,您得到的是天数,而不是: 可以将多个单位合并为一个值。因

  • 问题内容: 为了确定对能源使用的季节性影响,我需要将计费数据库中的能源使用信息与每月温度进行匹配。 我正在使用一个计费数据集,该数据集具有不同长度的账单以及开始日期和结束日期,我想获取每个月内每个帐户的月平均值。例如,我有一个具有以下特征的计费数据库: 我想弄清楚如何强制这些不规则的时间序列(对于每个帐户)以获取每个账单中每个月的每日平均金额,例如: 我完全不知道哪个工具可以执行此操作,因为我只需

  • 我试图从我的数据框中得到不同健康状况的男性和女性的平均年龄。 我可以得到平均年龄单独使用 但是有没有一种更雄辩的方法将它们全部汇总到一个表中,以便平均年龄的输出显示为 非常感谢。

  • 主要内容:1.平均值,2.中位数,3.众数R中的统计分析通过使用许多内置函数来执行的。这些函数大部分是R基础包的一部分。这些函数将R向量与参数一起作为输入,并在执行计算后给出结果。 我们在本章中讨论的是如何求平均值,中位数和众数。下面将分别一个个演示和讲解 - 1.平均值 平均值是通过取数值的总和并除以数据序列中的值的数量来计算。函数用于在R中计算平均值。 语法 R中计算平均值的基本语法是 - 以下是使用的参数的描述 - x - 是输入向