标签: xarray

如何乘以 Python Xarray 数据集?

我正在使用xarray.open_mfdataset()函数读取多个 netCDF 格式的数据文件(WRF 模型输出文件)。我读和destaggering各种变量,如变量QVAPORUVRESP。我正在使用以下代码读取 netCDF 变量并计算结果变量UQ

import xarray as xr

def desta_var(pp,var):
    flnm = xr.open_mfdataset(pp)
    if var=="U":
        U1 = (flnm.variables[var])
        U = 0.5*(U1[:,:,:,0:-1] + U1[:,:,:,1:] )
        del U1
        return U
    elif var=="V":
        V1 = (flnm.variables[var])
        V=0.5*(V1[:,:,0:-1,:] + V1[:,:,1:,:])
        del V1
        return V
    else:
        W1 = (flnm.variables[var])
        W=0.5*(W1[:,0:-1,:,:] + W1[:,1:,:,:])
        del W1
        return W

 U=desta_var('./WRF_3D_2005_*.nc','U')
 V=desta_var('./WRF_3D_2005_*.nc','V')

 flnm=xr.open_mfdataset('./WRF_3D_2005_*.nc')

 QV = flnm.QVAPOR
 UQ = U*QV
Run Code Online (Sandbox Code Playgroud)

使用上述代码获得的变量的维度和形状:

风变量的维数 Ex。U它的形状是

Times, lev, y, …

python netcdf python-xarray xarray

4
推荐指数
1
解决办法
2555
查看次数

用None替换xarray数据集中的值

我想用None替换xarray数据集中变量中的值。我尝试了这种方法,但是没有用:

da[da['var'] == -9999.]['var'] = None
Run Code Online (Sandbox Code Playgroud)

我收到此错误: *** TypeError: unhashable type: 'numpy.ndarray'

我可以在这里使用类似numpy replace的东西吗?da是xarray数据集。这里是什么da样子:

<xarray.Dataset>
Dimensions:  (band: 1, time: 3, x: 4258, y: 2334)
Coordinates:
  * band     (band) int32 1
  * y        (y) float64 4.406e+06 4.406e+06 4.406e+06 4.406e+06 4.406e+06 ...
  * x        (x) float64 1.125e+05 1.126e+05 1.127e+05 1.128e+05 1.129e+05 ...
  * time     (time) datetime64[ns] 2005-12-31 2006-12-31 2007-12-31
Data variables:
    var      (time, band, y, x) float32 dask.array<shape=(3, 1, 2334, 4258), chunksize=(1, 1, 2334, 4258)>
Run Code Online (Sandbox Code Playgroud)

这是da.var的样子:

<xarray.DataArray 'var' …
Run Code Online (Sandbox Code Playgroud)

python xarray

4
推荐指数
1
解决办法
2216
查看次数

如何使用groupby对xarray数据集进行下采样?

我想根据特定组对 xarray 数据集进行下采样,因此我使用的groupby是选择组,然后在每个组中抽取 10% 的样本。我正在使用下面的代码,但我得到IndexError: index 1330 is out of bounds for axis 0 with size 1330它向我表明我的函数正在返回一个空数组,但subset绝对具有非零维度。

squeeze=True根据GroupBy 文档,我正在使用我认为可以允许新维度的内容,但这没有帮助,所以我将其更改为squeeze=False.

你知道会发生什么吗?谢谢!

# Set random seed for reproducibility
np.random.seed(0)

def select_random_cell_subset(x):
    size = int(0.1 * len(x.cell))
    random_cells = sorted(np.random.choice(x.cell, size=size, replace=False))
    print('number of random cells:', len(random_cells))
    print('\tsome random cells:', random_cells[:5])
    subset = x.sel(cell=random_cells)
    print('subset:', subset)
    return subset

# squeeze=False because the final dataset is smaller than the original
ds_subset …
Run Code Online (Sandbox Code Playgroud)

python python-xarray xarray

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

xarray:从每月重新采样的平均值(不是气候学)计算每日异常

xarray 的文档解释了如何计算每月climatology 的异常值。在这里,我试图做一些稍微不同的事情:从每日时间序列,我想计算本月平均值(而不是每月气候学)的每日异常

我设法使用 groupby 和手动创建的每月邮票(下面的代码)来做到这一点。有没有更好、更简单的方法来获得相同的结果?

import xarray as xr
import numpy as np
import pandas as pd

# Create a data array
t = pd.date_range('2001', '2003', freq='D')
da = xr.DataArray(np.arange(len(t)), coords={'time':t}, dims='time')

# Monthly time stamp for groupby
da.coords['stamp'] = ('time', [str(y) + '-' + str(m) for (y, m) in 
                               zip(da['time.year'].values, 
                                   da['time.month'].values)])

# Anomaly
da_ano = da.groupby('stamp') - da.groupby('stamp').mean()

da_ano.plot();
Run Code Online (Sandbox Code Playgroud)

绘图输出

python python-xarray xarray

3
推荐指数
1
解决办法
824
查看次数

用另一个坐标替换 xarray 坐标

我尝试通过对 xarray.Dataset 使用一个坐标来替换 xarray.Dataset 中具有相同长度的两个坐标。我不在乎旧坐标或其值;我只是想更换它们。有什么方便的方法吗?

import xarray as xr
ds = xr.Dataset({
    "a": ("a_coord", [0, 1, 2]),
    "b": ("b_coord", [50, 10, 20]),
    "a_coord": [4, 8, 9],
    "b_coord": [3, 1, 4],
    "new_coord": [0, 1, 2],
})
# Get rid of a_coord and b_coord and replace both with new_coord, so a and b
# have new_coord as coordinate.
# But how?
Run Code Online (Sandbox Code Playgroud)

我试过了rename,但它返回一个冲突错误(因为 new_coord 已经存在)。

ds.rename({
    "a_coord": "new_coord",
    "b_coord": "new_coord",
})
Run Code Online (Sandbox Code Playgroud)

我是否必须将新坐标显式分配给依赖于旧坐标之一的每个数据变量?由于我有许多数据变量(不仅仅是 a 和 b)和其他坐标,这可能会变得混乱。

python coordinate xarray

3
推荐指数
1
解决办法
2922
查看次数

获取 xarray 数据集中的键列表

我正在向 xarray 数据集添加变量,当我完成后,我想提取一个键列表,但我找不到这样做的方法。

d = xr.Dataset()
d['key1'] = [1, 2]
d['key2'] = [3, 4]
Run Code Online (Sandbox Code Playgroud)

我想要的结果是

keylist = ['key1', 'key2']
Run Code Online (Sandbox Code Playgroud)

python python-3.x xarray

2
推荐指数
1
解决办法
5047
查看次数

xarray - 将字符串存储为 'string' 数据类型而不是 Python2.7 的 'char'(n 维字符数组)

我正在使用 xarray 将文本文件转换为 netCDF 格式。当我使用 netCDF4 格式和 Python3 时,它将字符串变量存储为字符串,但当我使用 Python2 时,它将它们存储为 n 维字符数组。我试图在编码中设置 dtype='str' 并且没有任何区别。有没有办法使用 Python2 使这些变量具有字符串数据类型?任何想法将不胜感激。

这是我的代码:

import pandas as pd
import xarray as xr

column_names = ['timestamp', 'air_temp', 'vtempdiff', 'rh', 'pressure', 'wind_dir', 'wind_spd']

df = pd.read_csv(args.input_file, skiprows = 1, header=None, names = column_names)
ds = xr.Dataset.from_dataframe(df)

encoding = {'timestamp': {'dtype': 'str'},
            'air_temp': {'_FillValue': 9.96921e+36, 'dtype': 'f4'}
            }

ds.to_netcdf(op_file.nc, format = 'NETCDF4', unlimited_dims={'time':True}, encoding = encoding)
Run Code Online (Sandbox Code Playgroud)

当我使用 Python3.6 对 op_file.nc 进行 ncdump 时,我得到:

netcdf op_file {
dimensions:
    time = …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-xarray netcdf4 xarray

2
推荐指数
1
解决办法
1010
查看次数

带权重的 Xarray 滚动均值

当我在 numpy 中使用权重进行跑步/滚动平均时,我会做这样的事情:

data = np.random.random(100)  # Example data...
weights = np.array([1, 2, 1])
data_m = np.convolve(data, weights/float(np.sum(weights)), "same")
Run Code Online (Sandbox Code Playgroud)

然后根据应用将 data_m[0] 和 data_m[-1] 替换为 nans 等。

可以用 xarray 做类似的事情。我所做的(在这种情况下)是

xr.DataArray(data).rolling(dim_0=3, center=True).mean(dim="dim_0")
Run Code Online (Sandbox Code Playgroud)

但这对应于权重

weights = np.array([1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

在 numpy 示例中。使用 xarray 时,我将如何应用其他权重?

python numpy python-xarray xarray

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

删除值并展平 xarray 数据集的 DataArrays

是否可以删除包含在 xarray 数据集中的 DataArrays 的值,以便xr_dataset将其转换为xr_flat下面的示例代码?

import xarray as xr
import numpy as np
n = np.nan

a = np.array([[n,n,1],
              [1,2,2],
              [2,n,n]], dtype='float32')
b = np.random.rand(3,3)
xr_dataset = xr.Dataset({'a': xr.DataArray(a, dims=['x', 'y']),
                         'b': xr.DataArray(b, dims=['x', 'y'])})

a_flat = a[np.isfinite(a)]
b_flat = b[np.isfinite(a)]

xr_flat = xr.Dataset({'a': xr.DataArray(a_flat),
                      'b': xr.DataArray(b_flat)})
Run Code Online (Sandbox Code Playgroud)

python xarray

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