当将zarr文件转换为dask数组时,我遇到了相当大的问题。这就是当我输入arr = da.from_zarr('gros.zarr/time')时得到的结果:

但是,当我尝试一个坐标,如时间,它是有效的:

有什么办法解决这个问题吗?
发布于 2022-06-22 16:41:09
在xarray中读取zarr数组时,默认情况下将启用dask,除非指定chunks=None。您绝对不必通过dask.dataframe --您可以直接从xarray.DataArray到dask.Array。实际上,甚至不需要一个副本--您所需要做的就是访问DataArray的底层DataArray属性。
下面是我在一个文件中的一个例子:
In [3]: import xarray as xr
...: import os
...:
...: fp = os.path.join(
...: ROOT_DIR,
...: 'ScenarioMIP/INM/INM-CM5-0/ssp370/r1i1p1f1/day/tasmax/v1.1.zarr'
...: )
...:
...: ds = xr.open_zarr(fp)
...: ds
Out[3]:
<xarray.Dataset>
Dimensions: (lat: 720, lon: 1440, time: 31390)
Coordinates:
* lat (lat) float64 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88
* lon (lon) float64 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9
* time (time) object 2015-01-01 12:00:00 ... 2100-12-31 12:00:00
Data variables:
tasmax (time, lat, lon) float32 dask.array<chunksize=(365, 360, 360), meta=np.ndarray>
Attributes: (12/47)
Conventions: CF-1.7 CMIP-6.2
activity_id: ScenarioMIP AerChemMIP
contact: climatesci@rhg.com
creation_date: 2019-06-17T08:27:21Z
data_specs_version: 01.00.29
dc6_bias_correction_method: Quantile Delta Method (QDM)
... ...
sub_experiment_id: none
table_id: day
tracking_id: hdl:21.14100/da7e759e-3979-42e4-b92f-02e7e2...
variable_id: tasmax
variant_label: r1i1p1f1
version_id: v20190618您可以将xarray Dataset看作是将DataArrays作为对象的高级字典。DataArray本身就是带有标记索引的N维数组.DataArray中包含的数据由一个数组“后端”提供,该数组通常是numpy或dask.Array。当您阅读一个zarr数据集时,结果将是一个带有一些额外的xarray索引&元数据处理的dask.Array。通过检查顶部的数组预览,我们可以看到这个数组中的值是一个dask数组:
In [4]: ds.tasmax
Out[4]:
<xarray.DataArray 'tasmax' (time: 31390, lat: 720, lon: 1440)>
dask.array<open_dataset-51b28ad08603ab401a85808d9fa3d6d7tasmax, shape=(31390, 720, 1440), dtype=float32, chunksize=(365, 360, 360), chunktype=numpy.ndarray>
Coordinates:
* lat (lat) float64 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88
* lon (lon) float64 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9
* time (time) object 2015-01-01 12:00:00 ... 2100-12-31 12:00:00
Attributes:
cell_measures: area: areacella
cell_methods: area: mean time: maximum (interval: 1 day)
comment: maximum near-surface (usually, 2 meter) air temperature (...
coordinates: height
history: 2019-06-17T08:27:21Z altered by CMOR: Treated scalar dime...
long_name: Daily Maximum Near-Surface Air Temperature
original_name: tasmax
standard_name: air_temperature
units: KXarray是一个很好的库,它允许您在N维空间中使用熊猫风格的索引。但是,如果您想直接使用dask.array,您可以简单地访问dask支持的xarray DataArray上的.data属性:
In [5]: ds.tasmax.data
Out[5]: dask.array<open_dataset-51b28ad08603ab401a85808d9fa3d6d7tasmax, shape=(31390, 720, 1440), dtype=float32, chunksize=(365, 360, 360), chunktype=numpy.ndarray>发布于 2022-06-22 09:08:32
正如@Michael在评论中指出的那样,如果xarray有效,那么这可能是最好的选择。
但是,如果出于某些原因,您确实希望用dask.array打开它,那么可以使用component kwarg指定感兴趣的组件:
from dask.array import from_zarr
x = from_zarr("gros.zarr", component="time")有关一些可重复的示例,请参见这篇博客文章。
https://stackoverflow.com/questions/72711348
复制相似问题