我想了解导致我在以下情况下收到警告消息的原因:
在之前的操作中,我创建了一些 NetCDF 文件并使用xarray.to_netcdf().
在 jupyter 笔记本中对这些数据集进行惰性评估完全没问题,并且在以下情况下我不会收到警告/错误:
.nc通过打开这些文件ds = xarray.open_mfdataset('/path/to/files/*.nc')ds.time.valuesds.sel(time=starttime)我似乎能够在对内存加载的数据进行计算时做我想做的一切。但是,我经常在以下情况下收到相同的错误集:
ds.sel(time=starttime).SCALAR_DATA.plot()ts = pd.Series(ds.SCALAR_DATA.loc[:,y,x], index=other_data.index)请注意,尽管有这些警告,我执行的操作确实会产生预期的结果(绘图、时间序列结构等)。
生成以下错误的共同点似乎是从打开的数据集中加载数据。编辑:经过一些进一步的实验,我的工作环境中的软件包版本可能会导致依赖 HDF5 的软件包版本之间发生一些冲突。
以下错误重复多次。
HDF5-DIAG: Error detected in HDF5 (1.12.2) thread 1:
#000: H5A.c line 528 in H5Aopen_by_name(): can't open attribute
major: Attribute
minor: Can't open object
#001: H5VLcallback.c line 1091 in H5VL_attr_open(): attribute open failed
major: Virtual Object Layer
minor: Can't open object
#002: H5VLcallback.c line 1058 in H5VL__attr_open(): attribute open failed …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用非常大的netCDF文件(每个大约400 Gb)的数据.每个文件都有一些变量,都比系统内存大得多(例如180 Gb vs 32 Gb RAM).我试图使用numpy和netCDF4-python通过一次复制一个切片并对该切片进行操作来对这些变量进行一些操作.不幸的是,读取每个切片需要很长时间,这会影响性能.
例如,其中一个变量是形状数组(500, 500, 450, 300).我想在切片上操作[:,:,0],所以我做了以下事情:
import netCDF4 as nc
f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]
Run Code Online (Sandbox Code Playgroud)
但最后一步需要很长时间(我的系统约5分钟).例如,如果我(500, 500, 300)在netcdf文件中保存了一个形状变量,那么相同大小的读取操作只需几秒钟.
有什么方法可以加快速度吗?一个明显的路径是转置数组,以便我选择的索引首先出现.但是在如此大的文件中,这在内存中是不可能的,并且考虑到简单的操作已经花费很长时间,尝试它似乎更慢.我想要的是以Fortran的界面get_vara函数的方式快速读取netcdf文件的一部分.或者某种有效转置阵列的方法.
我在R中编写一个函数,从netCDF文件中提取一些空气质量建模数据.我安装了包"ncdf".
为了让其他用户或我自己选择从netCDF文件中提取哪些变量,我想提取文件中所有变量的名称,这样我就可以在一个简单的列表中而不仅仅是print.ncdf()文件中提供很多信息.这有什么办法吗?
我尝试了ncdf对象unlist()的var字段,但它似乎也返回了内容...
我google搜索堆栈*溢出*但似乎没有找到答案,所以非常感谢你的帮助.
提前谢谢了.
我需要在netcdf文件中处理一个实际包含许多属性和变量的变量.我认为无法更新netcdf文件(请参阅如何删除Scientific.IO.NetCDF.NetCDFFile中的变量的问题?)
我的方法如下:
我的问题是编码第3步.我开始使用以下内容:
def processing(infile, variable, outfile):
data = fileH.variables[variable][:]
# do processing on data...
# and now save the result
fileH = NetCDFFile(infile, mode="r")
outfile = NetCDFFile(outfile, mode='w')
# build a list of variables without the processed variable
listOfVariables = list( itertools.ifilter( lamdba x:x!=variable , fileH.variables.keys() ) )
for ivar in listOfVariables:
# here I need to write each variable and each attribute
Run Code Online (Sandbox Code Playgroud)
如何在不需要重建整个数据结构的情况下将所有数据和属性保存在一小撮代码中?
我想用一个带有"无限"维度的R来编写一个netCDF文件,以后我可以扩展.
这是我尝试过的:
library(ncdf4)
## define lat, lon time dimensions
lat <- ncdim_def("latitude", "degrees_east", vals = 44.0, unlim = TRUE)
lon <- ncdim_def("longitude", "degrees_north", vals = -88.5, unlim = TRUE)
time <- ncdim_def("time", "days since 0000-01-01", 1:1000)
## define data with these dimensions
x <- ncvar_def("myvar", units = "m2", dim = list(lat, lon, time))
## create, write to, close nc file
nc <- nc_create(filename = "tmp.nc", vars = list(x))
ncvar_put(nc = nc, varid = x, vals = 1:1000)
nc_close(nc = …Run Code Online (Sandbox Code Playgroud) 有没有办法将具有相同时间维度但不同空间域的2个或更多netCDF文件合并为单个netCDF文件?空间域由纬度和经度坐标指定?在xarray concat,merge等的文档中,他们说它们使用单个维度
我有一个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值,我们将非常感谢您的建议.非常感谢!
我使用组织在不规则二维网格上的卫星数据,其尺寸为扫描线(沿轨道尺寸)和地面像素(跨越轨道尺寸).每个中心像素的纬度和经度信息存储在辅助坐标变量中,以及四个角坐标对(纬度和经度坐标在WGS84参考椭球上给出).数据存储在netCDF4文件中.
我想要做的是在投影地图上有效地绘制这些文件(可能还有文件的组合 - 下一步!).
我的做法,到目前为止,灵感来自杰里米的Voisey的回答这个问题,一直在打造我的兴趣可变连杆的像素边界的数据帧,并使用ggplot2与geom_polygon用于实际的情节.
让我来说明我的工作流程,并提前为天真的方法道歉:我刚开始用一周或两周的R编码.
注意
要完全重现问题:
1.下载两个数据帧:so2df.Rda(22M)和pixel_corners.Rda(26M)
2.在您的环境中加载它们,例如
so2df <- readRDS(file="so2df.Rda")
pixel_corners <- readRDS(file="pixel_corners.Rda")
Run Code Online (Sandbox Code Playgroud)
我要从我的文件中读取数据和纬度/经度边界.
library(ncdf4)
library(ggplot2)
library(ggmap)
# set path and filename
ncpath <- "/Users/stefano/src/s5p/products/e1dataset/L2__SO2/"
ncname <- "S5P_OFFL_L2__SO2____20171128T234133_20171129T003956_00661_01_022943_00000000T000000"
ncfname <- paste(ncpath, ncname, ".nc", sep="")
nc <- nc_open(ncfname)
# save fill value and multiplication factors
mfactor = ncatt_get(nc, "PRODUCT/sulfurdioxide_total_vertical_column",
"multiplication_factor_to_convert_to_DU")
fillvalue = ncatt_get(nc, "PRODUCT/sulfurdioxide_total_vertical_column",
"_FillValue")
# read the SO2 total column variable
so2tc <- …Run Code Online (Sandbox Code Playgroud) 我想在Ubuntu中使用R软件包RNetCDF和ncdf.
当我尝试install.packages('RNetCDF')或install.packages('ncdf'),我得到类似的错误:
...
ncdf.c:3:20: fatal error: netcdf.h: No such file or directory
compilation terminated.
make: *** [ncdf.o] Error 1
ERROR: compilation failed for package ‘ncdf’
...
Warning message:
In install.packages("ncdf") :
installation of package ‘ncdf’ had non-zero exit status
Run Code Online (Sandbox Code Playgroud)
已安装软件包libnetcdf6和netcdf-binUbuntu存储库.我还需要做点什么吗?
我正在尝试使用netcdf4-python从netcdf4文件中读取数据切片.这是第一次使用python,我遇到了内存问题.下面是代码的简化版本.在循环的每次迭代中,内存跳过相当于我读取的数据切片.当我遍历每个变量时,如何清理内存?
#!/usr/bin/env python
from netCDF4 import Dataset
import os
import sys
import psutil
process = psutil.Process(os.getpid())
def print_memory_usage():
nr_mbytes = process.get_memory_info()[0] / 1048576.0
sys.stdout.write("{}\n".format(nr_mbytes))
sys.stdout.flush()
# open input file and gather variable info
rootgrp_i = Dataset('data.nc','r')
vargrp_i = rootgrp_i.variables
# lets create a dictionary to store the metadata in
subdomain = {}
for suff in range(1000):
for var in vargrp_i:
v_i = vargrp_i[var]
if v_i.ndim == 1:
a=v_i[:]
elif v_i.ndim == 2:
a=v_i[0:20, 0:20]
elif v_i.ndim == 3:
a=v_i[0, 0:20, …Run Code Online (Sandbox Code Playgroud)