我有一个netCDF文件,我想从纬度/经度边界定义一个子集(即一个纬度/经度定义的框),使用R中的'ncdf'包.
我的netCDF文件摘要如下.它有两个维度(纬度和经度)和1个变量(10U_GDS4_SFC).它本质上是一个包含风值的纬度/长度网格:
[1] "file example.nc has 2 dimensions:"
[1] "lat_0 Size: 1280"
[1] "lon_1 Size: 2560"
[1] "------------------------"
[1] "file example.nc has 1 variables:"
[1] "float 10U_GDS4_SFC[lon_1,lat_0] Longname:10 metre U wind component Missval:1e+30"
Run Code Online (Sandbox Code Playgroud)
纬度变量从+90到-90运行,经度变量从0到360运行.
我希望使用以下地理边界边界提取整个网格的子集:
左下角:Lat:34.5˚,长:355˚,左上角:Lat:44.5˚,长:355˚,右上角:Lat:44.5˚,长:12˚,右下角:Lat:34.5˚ ,长:12˚
我知道可以使用get.var.ncdf()命令提取变量的一部分(下面的例子):
z1 = get.var.ncdf(example.nc, "10U_GDS4_SFC", start=c(11,26), count=c(5,5))
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何合并纬度/经度,以便最终得到包含变量值的子集空间网格.我不熟悉使用R中的netCDF值,我们将非常感谢您的建议.非常感谢!
给定此文件:
…根据我使用的软件,我得到不同的输出。
wgrib2 2019021815.grib2 -csv wgrib2.csv
Run Code Online (Sandbox Code Playgroud)
和
cdo outputtab,date,time,lat,lon,value 2019021815.grib2 > cdo.txt
Run Code Online (Sandbox Code Playgroud)
两种输出:
-3 (undefined) : 8,869,250 records
0 : 14,848,865 records
Other values : 781,885 records
___________________________________
Total : 24,500,000 records
Run Code Online (Sandbox Code Playgroud)
然而:
gdal_translate.exe -of xyz 2019021815.grib2 gdal.csv
Run Code Online (Sandbox Code Playgroud)
-3所有24,500,000条记录的输出。
如果使用Python + GDAL解析文件,则会得到相同的结果。
这是GDAL中的错误吗?我希望能够使用Python解析这些文件。
我还在将Windows用于GDAL,可以从https://gdal.org/download.html下载。
我正在使用Linux for CDO,可以从https://code.mpimet.mpg.de/projects/cdo/下载
我目前正在尝试使用一个 NetCDF 文件(可以从https://doi.pangaea.de/10.1594/PANGAEA.828650下载的开源数据)从该数据集中提取特定纬度(https://www.nodc .noaa.gov/archive/arc0105/0160558/3.3/data/0-data/spco2_1982-2015_MPI_SOM-FFN_v2016.nc,再次开源)。
第一个数据集是全球海洋中被称为生物群落的定义区域,我已成功从该区域中提取了覆盖标记为 16 和 17 的生物群落的区域。
该数据集具有以下网格类型:
gridtype = generic
gridsize = 64800
xsize = 180
ysize = 360
xname = lat
xunits = "degrees latitude"
yname = lon
yunits = "degrees longitude"
xfirst = -89.5
xinc = 1
yfirst = -179.5
yinc = 1
Run Code Online (Sandbox Code Playgroud)
第二种网格类型是海洋碳通量的全球数据集(参数:fgco2_raw),我希望从 Time_Varying_Biomes.nc 中生物群落 16 和 17 定义的区域中提取值。
此数据集 spco2_1982-2015_MPI_SOM-FFN_v2016.nc 具有以下网格类型:
gridtype = lonlat
gridsize = 64800
datatype = float
xsize = 360
ysize = 180
xname = lon
xlongname …Run Code Online (Sandbox Code Playgroud) 我有许多坐标(大约 20000 个),我需要从许多 NetCDF 文件中提取数据,每个文件大约有 30000 个时间步长(未来的气候情景)。使用此处的解决方案效率不高,原因是每个 i,j 将“dsloc”转换为“dataframe”所花费的时间(请查看下面的代码)。** 可以从此处下载 NetCDF 文件示例**
import pandas as pd
import xarray as xr
import time
#Generate some coordinates
coords_data = [{'lat': 68.04, 'lon': 15.20, 'stid':1},
{'lat':67.96, 'lon': 14.95, 'stid': 2}]
crd= pd.DataFrame(coords_data)
lat = crd["lat"]
lon = crd["lon"]
stid=crd["stid"]
NC = xr.open_dataset(nc_file)
point_list = zip(lat,lon,stid)
start_time = time.time()
for i,j,id in point_list:
print(i,j)
dsloc = NC.sel(lat=i,lon=j,method='nearest')
print("--- %s seconds ---" % (time.time() - start_time))
DT=dsloc.to_dataframe()
DT.insert(loc=0,column="station",value=id)
DT.reset_index(inplace=True)
temp=temp.append(DT,sort=True)
print("--- …Run Code Online (Sandbox Code Playgroud) 有没有办法在 Windows 上将 grib 文件转换为 NetCDF 格式?
我使用了一个名为的软件,tkdegrib但它通过一个参数捕获一个参数,而我希望所有 grib 的参数都在同一个文件中。不幸的是,我不能使用 Linux。
想象一下,您有一个文件example.nc,其风力数据定义在90N,90S,180E,180W区域.无论如何我可以在linux中使用简单的nc类型命令(不用在matlab/python中提取数据来重写),裁剪此文件以包含一个较小的区域,上面的子集.
例如,30N,10S,60E和30W.
我有一个 netcdf 文件,其中的数据是 lon、lat 和 time 的函数。我想计算在时间维度上求和的每个网格单元中缺失条目的总数,最好使用 CDO 或 NCO,因此我不需要调用 R、python 等。
我知道如何获得缺失值的总数
ncap2 -s "nmiss=var.number_miss()" in.nc out.nc
Run Code Online (Sandbox Code Playgroud)
正如我对这个相关问题的回答: count number of missing values in netcdf file - R
并且 CDO 可以告诉我空间总和
cdo info in.nc
Run Code Online (Sandbox Code Playgroud)
但我不知道如何随着时间的推移求和。例如,有没有一种方法可以指定要在 ncap2 中使用 number_miss 求和的维度?
我想提取一个相当大的netcdf文件的空间子集.从Loop到netcdf文件并运行计算 - Python或R.
from pylab import *
import netCDF4
f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.1989.nc')
# print variables
f.variables.keys()
atemp = f.variables['air'] # TODO: extract spatial subset
Run Code Online (Sandbox Code Playgroud)
如何仅提取对应于状态(例如爱荷华州)的netcdf文件的子集.爱荷华州有以下边界拉特隆:
经度:89°5'W至96°31'W
纬度:40°36'N至43°30'N
我有一个旋转坐标的NetCDF文件.我需要将它转换为普通的纬度/经度坐标(长度为-180到180,纬度为-90到90).
library(ncdf4)
nc_open('dat.nf')
Run Code Online (Sandbox Code Playgroud)
对于尺寸,它显示:
[1] " 5 variables (excluding dimension variables):"
[1] " double time_bnds[bnds,time] "
[1] " double lon[rlon,rlat] "
[1] " long_name: longitude"
[1] " units: degrees_east"
[1] " double lat[rlon,rlat] "
[1] " long_name: latitude"
[1] " units: degrees_north"
[1] " char rotated_pole[] "
[1] " grid_mapping_name: rotated_latitude_longitude"
[1] " grid_north_pole_longitude: 83"
[1] " grid_north_pole_latitude: 42.5"
[1] " float tasmax[rlon,rlat,time] "
[1] " long_name: Daily Maximum Near-Surface Air Temperature"
[1] " standard_name: air_temperature"
[1] " units: K" …Run Code Online (Sandbox Code Playgroud) 我从这里下载了 netCDF 文件。它们的分辨率为 0.5*0.5。我想以更粗的 1*1 分辨率重新网格这些文件。我找到了一些链接。第一个链接讨论 R 中的重新网格,但不使用双线性插值。在第二个环节涉及双线性插值,但使用的气候数据运算符(到我不是很熟悉)。然后我遇到了一个 R 包HiClimR。在这个包中,一个命令 coarseR降低了数据的分辨率。我将 netCDF 文件转换为 excel 文件并使用coarseR. 但是得到结果后我发现这个命令实际上以某种方式跳过了经纬度并将分辨率降低到1 * 1。简而言之,我的问题是
(1)coarseR用于降低分辨率是否正确?(2) 如何将双线性变换用于我在 R 中的特定问题?
提前谢谢了。
cdo-climate ×10
netcdf ×8
nco ×4
python ×3
r ×3
grib ×2
bash ×1
coordinates ×1
gdal ×1
geospatial ×1
linux ×1
missing-data ×1
netcdf4 ×1
rotation ×1
subset ×1