标签: python-xarray

在xarray(Python)中替换数据集坐标

我有存储在由NetCDF4格式的数据集Intensity的值与3个维度:Loop,DelayWavelength.我将我的坐标命名为与尺寸相同(我不知道它的好坏......)

我在Python中使用xarray(以前的xray)来加载数据集:

import xarray as xr
ds = xr.open_dataset('test_data.netcdf4')
Run Code Online (Sandbox Code Playgroud)

现在我想在跟踪原始数据的同时操纵数据.例如,我会:

  1. Delay坐标应用偏移量并保持原始数据Delay阵列不变.这似乎是通过以下方式完成的:

    ds_ = ds.assign_coords(Delay_corr=ds_.Delay.copy(deep=True) + 25)

  2. 将坐标替换DelayDelay_corr数据集中的所有相关数据阵列.但是,我不知道如何做到这一点,我没有在文档中找到任何东西.

有人会知道如何执行第2项吗?

要下载带有测试数据的NetCDF4文件:http://1drv.ms/1QHQTRy

python python-xarray

5
推荐指数
1
解决办法
3483
查看次数

如何合并坐标冲突的xArray数据集

假设我有两个数据集,每个数据集包含不同的关注变量,并且索引不完整(但不冲突):

In [1]: import xarray as xr, numpy as np
In [2]: ages = xr.Dataset(
          {'ages': (['kid_ids'], np.random.rand((3))*20)}, 
          coords={'kid_names':(['kid_ids'], ['carl','kathy','gail']), 'kid_ids': [10,14,16]})
In [3]: heights = xr.Dataset(
          {'heights': (['kid_ids'], np.random.rand((3))*160)}, 
          coords={'kid_names':(['kid_ids'], ['carl','keith','gail']), 'kid_ids': [10,13,16]})
Run Code Online (Sandbox Code Playgroud)

这将创建两个看起来应该很好合并的数据集:

In [4]: ages
Out[4]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 14 16
    kid_names  (kid_ids) <U5 'carl' 'kathy' 'gail'
Data variables:
    ages       (kid_ids) float64 13.28 1.955 4.327
In [5]: heights
Out[5]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 13 …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

5
推荐指数
1
解决办法
1247
查看次数

xarray.Dataset.where() 方法将 DataArrays 的 dtype 强制更改为浮动

问题描述

我有一个包含ints的数据集,我想根据某些条件选择一个子数据集,但我想保留整数数据类型。在我看来,Xarray 强制将整数数据更改为浮点数据类型。

示例设置

代码

import numpy
import xarray

nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)

输出

import numpy
import xarray

nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)

示例问题

代码

subdataset = dataset.where(dataset.num < 50, drop=True)
print(subdataset)
Run Code Online (Sandbox Code Playgroud)

输出

<xarray.Dataset>
Dimensions:  (dim_0: 13)
Coordinates:
  * dim_0    (dim_0) int64 0 1 2 …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

5
推荐指数
1
解决办法
921
查看次数

在写入to_netcdf时,为xarray数据集中的许多变量指定编码/压缩

我一直在写一些有多个变量的xarray.Datasets.目前,为了保持大小可管理,我指定了编码,例如zlib,但需要根据变量应用于变量(dataArray).

将相同的编码参数应用于所有变量的好方法是什么?例如

<xarray.Dataset>
Dimensions:  (lat: 1440, lon: 2880)
Coordinates:
  * lat      (lat) float64 -90.0 -89.88 -89.75 -89.62 -89.5 -89.38 -89.25 ...
  * lon      (lon) float64 -180.0 -179.9 -179.8 -179.6 -179.5 -179.4 -179.2 ...
Data variables:
a1     (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
b     (lat, lon) float64 nan nan nan nan nan nan 0.0 0.0 0.0 ...
c     (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
d      (lat, lon) …
Run Code Online (Sandbox Code Playgroud)

python-xarray

5
推荐指数
1
解决办法
1025
查看次数

xarray:重塑数据,拆分维度

我有一个xarray具有以下维度的数据集:

Dimensions:      (subject: 30, session: 5, time: 45000)
Coordinates:
  * subject      (subject) object '110' '112' '114' '117' ...
  * session      (session) object 'week1' 'week2' 'week3' ...
  * time         (time) timedelta64[ns] 00:00:00 00:00:00.040000 ...
Run Code Online (Sandbox Code Playgroud)

我想将每个试验(主题/会话组合)分成更小的时间段,例如分成 3 个段,每个段有 15000 个值,结果维度可能如下所示:

(subject: 30, session: 5, segment: 3, time: 15000)
Run Code Online (Sandbox Code Playgroud)

我已经搜索并尝试了很多东西但都没有成功,这怎么办?

我一直在尝试的一件事似乎很接近,就是创建一个新的 MultiIndex 并将其拆开。

segment_data = np.repeat(range(3),len(ds.time)//3)
segment = xr.Variable(dims='time',data=segment_data)
newtime_data = np.tile(ds.time[:len(ds.time)//3],3)
newtime = xr.Variable(dims='time',data=newtime_data)
dsr = ds.assign_coords(segment=segment,newtime=newtime)
dsr = dsr.set_index(segment='segment',newtime='newtime')
dsr = dsr.stack(fragment=['segment','newtime'])
Run Code Online (Sandbox Code Playgroud)

然而,最后一行需要大量内存,并且似乎创建了一个维度fragment: len(ds.time)**2,这似乎不正确。我也不确定在这之后我必须做什么(unstack('fragment')?)。

编辑:更多的尝试让我来到这里: …

python python-datetime python-xarray

5
推荐指数
1
解决办法
2443
查看次数

来自 Pandas.DataFrames 列表的 Xarray.DataSet

我有多个文件需要分析。首先,我将它们读入 BitString.Bits 列表。然后我将每个文件位拆分为我想要查看的特定部分并将它们保存到 Pandas.DataFrames 列表中。每个文件一个 DF。

现在为了进一步的绘图和分析目的,我想将所有数据存储在一个 Xarray.Dataset 中,其中我将 DataFrames 沿第三个轴堆叠,名称为“数据集”。

我试图将每个 DataFrame 连接到一个 DataSet:

xr.concat(data_df[:], dim="dataset")
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误,说我不能连接 DataArray 或 DataSets 以外的东西。我可以将 DataFrame 动态转换为 DataArrays 吗?

谢谢你的帮助!

来自德国的问候

python numpy scipy data-science python-xarray

5
推荐指数
1
解决办法
1026
查看次数

稀疏DataArray Xarray搜索

在xarray中使用DataArray对象,找到具有值的所有单元格的最佳方法是!= 0.

例如在熊猫中我会这样做

df.loc[df.col1 > 0]
Run Code Online (Sandbox Code Playgroud)

我的具体例子我正在试着看三维脑成像数据.

first_image_xarray.shape
(140, 140, 96)
dims = ['x','y','z']
Run Code Online (Sandbox Code Playgroud)

查看xarray.DataArray.where的文档,看起来我想要这样的东西:

first_image_xarray.where(first_image_xarray.y + first_image_xarray.x  > 0,drop = True)[:,0,0]
Run Code Online (Sandbox Code Playgroud)

但我仍然得到零的数组.

<xarray.DataArray (x: 140)>
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., …
Run Code Online (Sandbox Code Playgroud)

python pandas python-xarray

5
推荐指数
1
解决办法
322
查看次数

How to join data from multiple netCDF files with xarray in Python?

I'm trying to open multiple netCDF files with xarray in Python. The files have data with same shape and I want to join them, creating a new dimension.

I tried to use concat_dim argument for xarray.open_mfdataset(), but it doesn't work as expected. An example is given below, which open two files with temperature data for 124 times, 241 latitudes and 480 longitudes:

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases' )
da_t2m = DS.t2m

print( da_t2m )
Run Code Online (Sandbox Code Playgroud)

有了这段代码,我希望结果数据数组的形状像(情况:2,时间:124,纬度:241,经度:480)。但是,其形状为(案例:2,时间:248,纬度:241,经度:480)。它创建了一个新维度,但也将最左边的维度相加:两个数据集的“时间”维度。我想知道这是来自“ xarray.open_mfdateset”的错误还是预期的行为,因为两个数据集的“时间”维度都是无限的。

有没有一种方法可以直接使用xarray从这些文件中联接数据并获得上述预期收益?

谢谢。

马泰斯

python concatenation netcdf python-xarray

5
推荐指数
1
解决办法
653
查看次数

python获取月份最大值xarray

如何获得最大径流月份

我想获得每年以及整个时间序列最大径流量的月份。这个想法是通过查看最大径流月份来描述全球季节性特征。然后,我想尝试考虑每个像素是否具有单峰或双峰状态。

我想创建一个地图,就像这里的Pangeo示例中的一样。

范例图片

这表示最大降水的小时数。我想显示最大径流量的MONTH(以整数表示)。

获取数据

在这里,我下载了GRUN径流数据并创建了一个xarray对象。 注意:此处的数据集大于1GB。我正在使用它使此示例完全可重复。

# get the data
import subprocess
command = """
wget -O grun.nc https://www.research-collection.ethz.ch/bitstream/handle/20.500.11850/324386/GRUN_v1_GSWP3_WGS84_05_1902_2014.nc?sequence=1&isAllowed=y
"""
import os
if not os.path.exists('grun.nc'):
  process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
  output, error = process.communicate()

# read the data
import xarray as xr
ds = xr.open_dataset('grun.nc')

# select a subset so we can work with it more quickly
ds = ds.isel(time=slice(-100,-1))
ds

Out[]:
<xarray.Dataset>
Dimensions:  (lat: 360, lon: 720, time: 99)
Coordinates:
  * lon      (lon) float64 …
Run Code Online (Sandbox Code Playgroud)

python numpy python-3.x pandas python-xarray

5
推荐指数
1
解决办法
153
查看次数

并行引导,替换为xarray / dask

我想执行N = 1000引导,并替换网格数据。一次计算大约需要0.5s。我可以访问具有48个内核的超级计算机专用节点。因为重采样是相互独立的,所以我天真地希望将工作负载分配到所有或至少多个内核上,并使性能提高0.8 * ncores。但是我不明白。

我仍然缺乏对敏捷的了解。基于设置敏捷工作者数量的最佳实践,我使用:

from dask.distributed import Client
client = Client(processes=False, threads_per_worker=8, n_workers=6, memory_limit=‘32GB')
Run Code Online (Sandbox Code Playgroud)

我也尝试过SLURMCluster,但我想我首先需要了解自己的工作,然后进行扩展。

我的MWE:

  1. 创建样本数据
  2. 我想申请的写功能
  3. 编写重采样init函数
  4. 使用引导程序(= N)作为参数编写引导功能:请参阅下面的许多实现
  5. 执行引导
import dask
import numpy as np
import xarray as xr
from dask.distributed import Client

inits = np.arange(50)
lats = np.arange(96)
lons = np.arange(192)
data = np.random.rand(len(inits), len(lats), len(lons))
a = xr.DataArray(data,
                        coords=[inits, lats, lons],
                        dims=['init', 'lat', 'lon'])

data = np.random.rand(len(inits), len(lats), len(lons))
b = xr.DataArray(data,
                        coords=[inits, lats, lons],
                        dims=['init', 'lat', 'lon'])

def func(a,b, dim='init'): …
Run Code Online (Sandbox Code Playgroud)

multiprocessing resampling dask python-xarray

5
推荐指数
1
解决办法
98
查看次数