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

从R中的netCDF提取点(lon,lat)的时间序列

公西姚石
2023-03-14

我对R相对较新。我正在尝试从 netCDF 文件中获取温度数据的不同点(纬度、纬度)的时间序列。我的示例数据文件在这里,这里是小文件。我已经尝试了netCDF包和到目前为止我使用的代码

library(ncdf)
obsdata = open.ncdf("obs.nc")

print.ncdf(obsdata) 

obsdatadates = obsdata$dim$time$vals
obsdatadates = as.Date(obsdatadates,origin = '1950-01-01') 
obsdatadates
obsoutput = get.var.ncdf(obsdata, varid = 'tasmin', start = c(1,1,1),
                         count = c(1,1,22280))
dim(obsoutput)
datafinal=merge(obsdatadates,obsoutput)

有人能帮我得到一个时间序列的数据帧(第一列)和另一列中某个特定点(lat,lon)的数据值吗。在这种情况下,我正在寻找一个特定纬度点(并对许多兴趣点重复)和给定变量(在本例中为tasmin)的时间序列(1950-01-01至2010-12-31,数据为)。你的帮助将不胜感激。谢谢你,阿塞姆

共有3个答案

仲学真
2023-03-14

“ncdf”包已被弃用:http://cirrus.ucsd.edu/~pierce/ncdf/

使用ncdf4软件包更新:

library(ncdf4)
obsdata <- nc_open("obs1.nc")
print(obsdata) # check that dims are lon-lat-time

# location of interest
lon <- 6  # longitude of location
lat <- 51 # latitude  of location

# get dates
obsdatadates <- as.Date(obsdata$dim$time$vals, origin = '1950-01-01')

# get values at location lonlat
obsoutput <- ncvar_get(obsdata, varid = 'tasmin',
                  start= c(which.min(abs(obsdata$dim$longitude$vals - lon)), # look for closest long
                           which.min(abs(obsdata$dim$latitude$vals - lat)),  # look for closest lat
                           1),
                  count = c(1,1,-1)) #count '-1' means 'all values along that dimension'that dimension'
# create dataframe
datafinal <- data.frame(dates= obsdatadates, obs = obsoutput)
司空通
2023-03-14

以下是我将如何使用ncdf继续执行此操作:

library(ncdf)
obsdata = open.ncdf("obs1.nc")
obsdatadates = as.Date(obsdata$dim$time$vals,origin = '1950-01-01')
#Get the whole data first
obsoutput = get.var.ncdf(obsdata, varid = 'tasmin')
#Prepare your points of interest
points_of_interest = data.frame(lat=seq(1,8,by=2),lon=c(1,5,3,6))
#Subset your data accordingly
data_at_point = apply(points_of_interest,1,function(x)obsoutput[x[1],x[2],])
#Turn it into a dataframe
data_at_point = as.data.frame(data_at_point)
#Add the dates to the dataframe
data_at_point$Date = obsdatadates
勾炳
2023-03-14

也许使用光栅包,这不适用于所有 NetCDF 文件,但它适用于您的文件

library(raster)
## brick reads all 22280 layers
r <- brick("obs.nc", varname = "tasmin")
## extract works for all time steps
vals <- extract(r, matrix(c(-120, 52.5), ncol = 2))

dim(vals)
## [1]     1 22280

请注意,这给出了一个1行、多列的矩阵,因为我只给了一个点给提取()

(提取很简单,直接从最近的单元格复制,使用method=“双线性”进行插值)。查看<代码>?提取以获取其他选项。

 类似资料:
  • 我在1998-01-01到1998-12-31期间使用TRMM_3B42_Daily产品创建了这个文件。这是我在R中使用的脚本: 通过这个链接,我试图提取值来绘制时间序列,但似乎我正在平均两个单元格的值,而不仅仅是提取单个单元格的值。我该如何解决这个问题?有没有办法创建一个循环,以便它提取不同单元格的值?(在这种情况下,它将是13 x 21=273) 我还发现了另外两个问题,即 excel 文件中

  • 这是我第一次使用堆栈溢出,我的编码技术非常糟糕,我正在使用一个历史tos的NetCDF文件。我想提取特定lat和lon的tos数据。我有一个三维数组中的tos数据,lon和lat分别在一个二维矩阵中。问题是,我选择的lon和lat的行列组合与tos数组的行-列组合不一致。下面是我目前掌握的代码 我被困在这里,因为我的纬度和纬度矩阵的行和列数与 tos day1 数组的行和列号不对应。 如果你不明白

  • 一个与R有关的新手问题。如何使用R从netdcf文件中提取特定位置的时间序列数据。例如,下面的快照显示位置(1、2)的时间序列为13、28、43。 提前谢谢。

  • 我正在处理三维(x,y,time)NetCDF文件,其中包含一年中每小时的PM10浓度估计值。我的目标是提取几个坐标的每小时估计值——所以这将是365天*24小时=8760个估计值/年/坐标——然后平均到每日(365)估计值。 我的脚本(见下文)在2013年运行良好,但2012年的输出有很多NAs。我注意到的区别是2012年的lon/lat文件以矩阵形式存储。。。 对于2013年的文件,lon是“

  • 我有一个使用Google静态地图的JAVA项目要做,经过几个小时的工作,我不能得到一个东西工作,我会解释一切,我希望有人能帮助我。 我使用的是静态地图(480pixelsx480pixels),地图的中心是lat=47,lon=1.5,缩放级别是5。 现在我需要的是当我点击这个静态地图上的一个像素时能够得到lat和lon。经过一些搜索,我发现我应该使用墨卡托投影(对吗?),我还发现每个变焦级别在水

  • 我有很大的NetCDF文件(~23GB),我从这些文件中提取点数据,并通过xarray加载到numpy数组中。在一个循环中,这个过程运行得很完美——但是当我尝试用一个更小的单个文件(3.8GB)运行时,代码永远不会运行完。 我不想问这个关于堆栈的问题,因为它是特定于数据的,所以示例代码并没有真正的帮助。然而,xarray中的文件有一个结构“Time,stid”-stid表示站点ID,这个维度只是命