我正在寻找一种从 xarray.DataSet 对象中提取数据变量名称(字符串)列表的方法。我已经使用过xr_object.data_vars,xr_object.data_vars.keys()但它们似乎没有提供任何有用的东西。
另外, xarray 的文档似乎没有显示 xarray 有一个内置的方法或属性来获取类似的东西。
有人知道该怎么做吗?
我有一个 xarray DataArray,如下所示,形状为 (1,5,73,144,17),我试图删除或删除“级别”坐标。所以,最终,我需要变量的形状 = (1,5,73,144)。
stdna
Out[717]:
<xarray.DataArray 'stack-6e9b86fc65e3f0fda2008a339e235bc7' (variable: 1, week: 5, lat: 73, lon: 144,
level: 17)>
dask.array<stack, shape=(1, 5, 73, 144, 17), dtype=float32, chunksize=(1, 1, 73, 144, 17),
chunktype=numpy.ndarray>
Coordinates:
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* lat (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
* level (level) float32 1000.0 925.0 850.0 700.0 ... 50.0 30.0 20.0 10.0
* week (week) int64 5 …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的netCDF文件,我正在使用python中的netCDF4阅读
我无法一次读取此文件,因为它的尺寸(1200 x 720 x 1440)太大,整个文件不能同时在内存中.第一维代表时间,下一个分别代表纬度和经度.
import netCDF4
nc_file = netCDF4.Dataset(path_file, 'r', format='NETCDF4')
for yr in years:
nc_file.variables[variable_name][int(yr), :, :]
Run Code Online (Sandbox Code Playgroud)
然而,一次阅读一年是非常缓慢的.如何加快以下用例的速度?
- 编辑
chunksize是1
我可以阅读一系列年份:nc_file.variables [variable_name] [0:100,:,]
有几个用例:
多年来:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :])
Run Code Online (Sandbox Code Playgroud)# Multiply each year by a 2D array of shape (720 x 1440)
for yr in years:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :] * arr_2d)
Run Code Online (Sandbox Code Playgroud)
# Add 2 netcdf files together
for yr in years:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :] +
nc_file2.variables[variable_name][int(yr), :, :])
Run Code Online (Sandbox Code Playgroud) 我正在尝试有效地重组大型多维数据集。假设随着时间的推移,我有许多遥感图像,其中有许多波段,坐标为 xy 像素位置,时间为图像采集时间,波段为收集的不同数据。
在我的用例中,假设 xarray 坐标长度大约为 x (3000)、y (3000)、时间 (10),带有浮点数据带 (40)。所以 100GB+ 的数据。
我一直在尝试从这个例子中工作,但我在将它翻译成这个案例时遇到了麻烦。
注意:实际数据比这个例子大得多。
import numpy as np
import dask.array as da
import xarray as xr
nrows = 100
ncols = 200
row_chunks = 50
col_chunks = 50
data = da.random.random(size=(1, nrows, ncols), chunks=(1, row_chunks, col_chunks))
def create_band(data, x, y, band_name):
return xr.DataArray(data,
dims=('band', 'y', 'x'),
coords={'band': [band_name],
'y': y,
'x': x})
def create_coords(data, left, top, celly, cellx):
nrows = data.shape[-2]
ncols = data.shape[-1]
right = …Run Code Online (Sandbox Code Playgroud) 我想了解导致我在以下情况下收到警告消息的原因:
在之前的操作中,我创建了一些 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) 我有一个包使用pandas面板来生成MultiIndex pandas DataFrames.但是,每当我使用pandas.Panel时,我都会得到以下DeprecationError:
DeprecationWarning:Panel已弃用,将在以后的版本中删除.表示这些类型的三维数据的推荐方法是通过Panel.to_frame()方法在DataFrame上使用MultiIndex.或者,您可以使用xarray包http://xarray.pydata.org/en/stable/.Pandas提供了
.to_xarray()一种帮助自动执行此转换的方法.
但是,我无法理解这里的第一个建议实际上是为了创建MultiIndex DataFrames而推荐的.如果要删除Panel,我将如何使用Panel.to_frame?
澄清:我不是在问什么是弃用,或者如何将我的Panel转换为DataFrames.我要问的是,如果我在库中使用pandas.Panel然后使用pandas.Panel.to_frame从3D ndarrays创建MultiIndex DataFrames,并且不推荐使用Panels,那么制作这些DataFrames的最佳选择是什么使用Panel API?
例如,如果我正在执行以下操作,将X作为具有形状(N,J,K)的ndarray:
p = pd.Panel(X, items=item_names, major_axis=names0, minor_axis=names1)
df = p.to_frame()
Run Code Online (Sandbox Code Playgroud)
对于DataFrame构建来说,这显然不再是一个可行的面向未来的选项,尽管这是该问题中推荐的方法.
有没有办法将具有相同时间维度但不同空间域的2个或更多netCDF文件合并为单个netCDF文件?空间域由纬度和经度坐标指定?在xarray concat,merge等的文档中,他们说它们使用单个维度
简单的问题:我不仅想要xarray DataArray中的最大值,还要想要它的坐标.怎么做?
我当然可以编写自己的简单reduce函数,但我想知道xarray中是否有内置函数?
我有一个文件夹,包含2006 - 2001年的NetCDF文件,十年块(2011-2020,2021-2030等).
我想创建一个新的NetCDF文件,其中包含连接在一起的所有这些文件.到目前为止,我已阅读过文件:
ds = xarray.open_dataset('Path/to/file/20062010.nc')
ds1 = xarray.open_dataset('Path/to/file/20112020.nc')
etc.
Run Code Online (Sandbox Code Playgroud)
然后像这样合并这些:
dsmerged = xarray.merge([ds,ds1])
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是很笨重,并且必须有一种更简单的方法来自动化这个过程,因为我将为许多不同文件夹的文件夹执行此操作.有没有更有效的方法来做到这一点?
编辑:
尝试使用glob加入这些文件:
for filename in glob.glob('path/to/file/.*nc'):
dsmerged = xarray.merge([filename])
Run Code Online (Sandbox Code Playgroud)
给出错误:
AttributeError: 'str' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
这只是读取文件名的文本,而不是实际文件本身,所以它不能合并它.如何打开,存储为变量,然后合并而不是一点一点地进行合并?
我有一些昏暗的数组,'time', 'lat', 'lon'有些只是'lat', 'lon'。为了使用2d(纬度)掩码来掩盖时间相关的数据,我经常必须这样做:
x.data[:, mask.data] = np.nan
Run Code Online (Sandbox Code Playgroud)
当然,计算会按预期进行广播。如果y是2d纬度数据,则将其值广播到x中的所有时间坐标:
z = x + y
Run Code Online (Sandbox Code Playgroud)
但是索引不会像我期望的那样广播。我希望能够执行此操作,但是会引发ValueError:缓冲区的维数错误:
x[mask] = np.nan
Run Code Online (Sandbox Code Playgroud)
最后,似乎xr.where 确实按预期跨时间坐标广播了掩码的值,但是您不能以这种方式设置值。
x_masked = x.where(mask)
Run Code Online (Sandbox Code Playgroud)
因此,在这里我缺少什么可以使用缺少尺寸(并且需要广播)的布尔掩码方便设置值的方法吗?我在顶部提供的选项确实是执行此操作的方式吗(在这种情况下,我不妨使用标准的numpy数组...)