标签: python-xarray

如何获取包含 xarray.Dataset 变量名称的列表?

我正在寻找一种从 xarray.DataSet 对象中提取数据变量名称(字符串)列表的方法。我已经使用过xr_object.data_varsxr_object.data_vars.keys()但它们似乎没有提供任何有用的东西。

另外, xarray 的文档似乎没有显示 xarray 有一个内置的方法或属性来获取类似的东西。

有人知道该怎么做吗?

python-xarray

19
推荐指数
2
解决办法
3万
查看次数

从 xarray DataArray 中删除坐标

我有一个 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)

python python-xarray

15
推荐指数
2
解决办法
3万
查看次数

加快阅读python中非常大的netcdf文件

我有一个非常大的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

  1. 我可以阅读一系列年份:nc_file.variables [variable_name] [0:100,:,]

  2. 有几个用例:

    多年来:

    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)

python numpy netcdf dask python-xarray

13
推荐指数
1
解决办法
4711
查看次数

以块的形式写入 xarray 多索引数据

我正在尝试有效地重组大型多维数据集。假设随着时间的推移,我有许多遥感图像,其中有许多波段,坐标为 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)

python arrays parquet dask python-xarray

12
推荐指数
1
解决办法
526
查看次数

访问 Xarray 数据集时的 HDF5 警告

我想了解导致我在以下情况下收到警告消息的原因:

在之前的操作中,我创建了一些 NetCDF 文件并使用xarray.to_netcdf().

在 jupyter 笔记本中对这些数据集进行惰性评估完全没问题,并且在以下情况下我不会收到警告/错误:

  • .nc通过打开这些文件ds = xarray.open_mfdataset('/path/to/files/*.nc')
  • 通过以下方式将尺寸数据加载到内存中ds.time.values
  • 惰性选择通过ds.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)

hdf5 netcdf python-xarray netcdf4

12
推荐指数
3
解决办法
3229
查看次数

什么是pandas.Panel弃用警告实际推荐?

我有一个包使用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构建来说,这显然不再是一个可行的面向未来的选项,尽管这是该问题中推荐的方法.

python numpy dataframe pandas python-xarray

11
推荐指数
1
解决办法
6343
查看次数

使用xarray python组合空间netcdf文件

有没有办法将具有相同时间维度但不同空间域的2个或更多netCDF文件合并为单个netCDF文件?空间域由纬度和经度坐标指定?在xarray concat,merge等的文档中,他们说它们使用单​​个维度

python netcdf python-xarray

11
推荐指数
2
解决办法
565
查看次数

如何在xarray中获取最大坐标?

简单的问题:我不仅想要xarray DataArray中的最大值,还要想要它的坐标.怎么做?

我当然可以编写自己的简单reduce函数,但我想知道xarray中是否有内置函数?

python-xarray

10
推荐指数
2
解决办法
2954
查看次数

使用xarray加入/合并多个NetCDF文件

我有一个文件夹,包含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)

这只是读取文件名的文本,而不是实际文件本身,所以它不能合并它.如何打开,存储为变量,然后合并而不是一点一点地进行合并?

python merge join python-xarray

10
推荐指数
1
解决办法
1751
查看次数

xarray中的布尔索引

我有一些昏暗的数组,'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数组...)

python numpy python-xarray

9
推荐指数
1
解决办法
1099
查看次数

标签 统计

python-xarray ×10

python ×7

netcdf ×3

numpy ×3

dask ×2

arrays ×1

dataframe ×1

hdf5 ×1

join ×1

merge ×1

netcdf4 ×1

pandas ×1

parquet ×1