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

从R中的netCDF提取时间序列

宰坚
2023-03-14

我在1998-01-01到1998-12-31期间使用TRMM_3B42_Daily产品创建了这个文件。这是我在R中使用的脚本:

lon=seq(-91.875,-86.875,by= 0.25)
lat=seq(13.875,16.875,by= 0.25)

x_dim <- ncdim_def( "lon", "degrees_east", lon, create_dimvar=TRUE)
y_dim <- ncdim_def( "lat", "degrees_north", lat, create_dimvar=TRUE)
t_dim <- ncdim_def( "time", "days since 1997-12-31 12:00:00.0 -0:00", 1:365, unlim=FALSE)
mv=9999.900390625 
precipitation_var <- ncvar_def("precipitation", "mm", list(y_dim,x_dim,t_dim), mv)


nrow = 13 
ncol = 21 

NA.matrix=matrix(rep(NA,nrow*ncol)) 

precip=array(NA.matrix,c(nrow,ncol, 1))
for (i in 1:length(test01)){precip_nc=nc_open(test01[i])
precip_get_nc=ncvar_get(precip_nc,"precipitation") 
precip=abind(precip,precip_get_nc)}

precip=precip[,,-1]  

PRECIPITATION_nc = nc_create("PRECIPITATION_1998.nc", precipitation_var)

precipitation_nc_put=ncvar_put (PRECIPITATION_nc, precipitation_var, precip)

nc_close(PRECIPITATION_nc)

通过这个链接,我试图提取值来绘制时间序列,但似乎我正在平均两个单元格的值,而不仅仅是提取单个单元格的值。我该如何解决这个问题?有没有办法创建一个循环,以便它提取不同单元格的值?(在这种情况下,它将是13 x 21=273)

b <- brick('PRECIPITATION_1998.nc')
be <- crop(b, extent(13.875, 14.125, -91.875,-91.625))
a <- aggregate(be, dim(be)[2:1], na.rm=TRUE)
v <- values(a)
write.csv(v, 'precip.csv', row.names=FALSE)

我还发现了另外两个问题,即 excel 文件中的日期前面有一个 X,并且值水平显示而不是垂直显示。任何帮助将不胜感激!谢谢

共有1个答案

西门振
2023-03-14

通过创建一个 SpatialPoints 对象,其中包含要从中提取数据的点,然后执行提取操作,可以轻松完成点数据提取。确定其他主题:添加“X”是因为列名不能以数字开头,因此添加了一个字符。提取后可以通过一些转置轻松更改水平顺序

例如,这应该有效(它还解决了“X”问题并将格式更改为“类似列”):

library(raster)
library(stringr)
library(lubridate)
library(tidyverse)

b <- brick('/home/lb/Temp/buttami/PRECIPITATION_1998.nc')
lon = c(-91.875,-91.625)  # Array of x coordinates
lat <- c(13.875, 14.125)  # Array of y coordinates
points <- SpatialPoints(cbind(lat,lon)), # Build a spPoints object

# Etract and tidy
points_data <- b %>% 
  raster::extract(points, df = T) %>% 
  gather(date, value, -ID) %>% 
  spread(ID, value) %>%   # Can be skipped if you want a "long" table
  mutate(date = ymd(str_sub(names(b),2))) %>% 
  as_tibble()

points_data 

# A tibble: 365 × 3
         date   `1`   `2`
       <date> <dbl> <dbl>
1  1998-01-01     0     0
2  1998-01-02     0     0
3  1998-01-03     0     0
4  1998-01-04     0     0
5  1998-01-05     0     0
6  1998-01-06     0     0
7  1998-01-07     0     0
8  1998-01-08     0     0
9  1998-01-09     0     0
10 1998-01-10     0     0
# ... with 355 more rows

plot(points_data$date,points_data$`1`)
 类似资料:
  • 我对R相对较新。我正在尝试从 netCDF 文件中获取温度数据的不同点(纬度、纬度)的时间序列。我的示例数据文件在这里,这里是小文件。我已经尝试了netCDF包和到目前为止我使用的代码 有人能帮我得到一个时间序列的数据帧(第一列)和另一列中某个特定点(lat,lon)的数据值吗。在这种情况下,我正在寻找一个特定纬度点(并对许多兴趣点重复)和给定变量(在本例中为tasmin)的时间序列(1950-0

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

  • 我有一些大型 netCDF 文件,其中包含 6 个分辨率为 0.5 度的地球每小时数据。 每年有360个纬度点,720个经度点和1420个时间点。我有年度文件(12 GB ea)和一个包含110年数据(1.3 TB)的文件存储为netCDF-4(这是1901年数据,1901.nc,其使用策略以及我开始使用的原始公共文件的示例)。 根据我的理解,从一个netCDF文件中读取应该比遍历最初提供的由年份

  • 我想使用R从每个位置(X和Y)的Netcdf数据集中提取时间序列数据并将其转换为csv文件。这是我第一次处理NetCDF数据。有人能告诉我使用R或Matlab的相关代码吗? 这是我的数据描述: IRI FD季节性预测降水问题:Tercile概率数据 独立变量(网格): Tercile Classes网格:/C(ids)无序[(低于正常)(正常)(高于正常)]:发布的网格月份预测 网格:/F(自19

  • 我已经搜索了很长时间,但仍然无法弄清楚这一点。似乎光栅包是要提取的,但只能从二维数据中提取。 这个四维数据的例子,一个netCDF文件包含连续三天(72小时)的每小时压力水平(4级)气温。https://drive.google.com/file/d/1UIiX9-xHrtH2FT1torg53iPxyzLxSYQu/view?usp=sharing。 我只想提取一些点位置(xy)的温度,以及相应

  • 我有一个netCDF文件。结构: 如何提取特定经纬度(比如86.45,-156.25)和时间(比如2016-01-10)的网格单元的值?精确的纬度/经度值可能不在坐标中,在这种情况下,我们需要最接近的纬度/经度值 我可以像这样提取特定经度的值: 然而,由于-20在经度坐标中不存在,因此这不起作用。