我正在使用xarray.open_mfdataset()函数读取多个 netCDF 格式的数据文件(WRF 模型输出文件)。我读和destaggering各种变量,如变量QVAPOR,U和VRESP。我正在使用以下代码读取 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, …
我想用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) 我想根据特定组对 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) 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)
我尝试通过对 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)和其他坐标,这可能会变得混乱。
我正在向 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) 我正在使用 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) 当我在 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 时,我将如何应用其他权重?
是否可以删除包含在 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)