import xarray as xr
import cartopy.crs as ccrs
USA_PROJ = ccrs.AlbersEqualArea(central_longitude=-97., central_latitude=38.)
g_simple = ds_by_month.t2m.plot(x='longitude',
y='latitude',
col='month',
col_wrap=6,
aspect=ds.dims['longitude'] / ds.dims['latitude'],
subplot_kws=dict(projection=USA_PROJ),
add_colorbar=False,
transform=ccrs.PlateCarree())
g_simple.add_colorbar(orientation='horizontal')
for ax in g_simple.axes.ravel():
ax.coastlines()
ax.set_extent([-121, -72, 22.5, 50])
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
如何确保颜色条与图形重叠?即使我使用xarray默认颜色条,也会发生重叠.
该大熊猫透视表的文件似乎建议更换使用multiindexing数据超过两个维度进行处理:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import pandas.util.testing as tm; tm.N = 3
In [4]: def unpivot(frame):
...: N, K = frame.shape
...: data = {'value' : frame.values.ravel('F'),
...: 'variable' : np.asarray(frame.columns).repeat(N),
...: 'date' : np.tile(np.asarray(frame.index), K)}
...: return pd.DataFrame(data, columns=['date', 'variable', 'value'])
...:
In [5]: df = unpivot(tm.makeTimeDataFrame())
In [6]: df
Out[6]:
date variable value value2
0 2000-01-03 A 0.462461 0.924921
1 2000-01-04 A -0.517911 -1.035823
2 2000-01-05 …Run Code Online (Sandbox Code Playgroud) 我有一个netCDF文件,其时间维度包含2小时的数据.我希望平均每小时获得每小时的平均时数.我试过这个:
import xarray as xr
ds = xr.open_mfdataset('ecmwf_usa_2015.nc')
ds.groupby(['time.month', 'time.hour']).mean('time')
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
*** TypeError: `group` must be an xarray.DataArray or the name of an xarray variable or dimension
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?如果我这样做:
ds.groupby('time.month', 'time.hour').mean('time')
Run Code Online (Sandbox Code Playgroud)
我没有得到错误,但结果的时间维度为12(每个月一个值),而我想要每个月的小时平均值,即每12个月24个值.数据可在此处获取:https://www.dropbox.com/s/yqgg80wn8bjdksy/ecmwf_usa_2015.nc?dl = 0
我在这个话题上遇到了困难,尽管它看起来应该很简单。
我想使用一组纬度和经度坐标对 xarray 数据集进行切片。
这是我的数据集的样子:
In [31]: data = xr.open_mfdataset(open_file, decode_cf=True)
In [32]: data
Out[32]:
<xarray.Dataset>
Dimensions: (time: 108120, x: 349, y: 277)
Coordinates:
lons (y, x) float64 -145.5 -145.3 -145.1 -144.9 -144.8 -144.6 -144.4 ...
lats (y, x) float64 1.0 1.104 1.208 1.312 1.416 1.519 1.621 1.724 ...
* time (time) datetime64[ns] 1980-01-01 1980-01-01T03:00:00 ...
Dimensions without coordinates: x, y
Data variables:
stp (time, y, x) float64 0.1235 0.0867 0.07183 0.05389 0.05901 ...
Run Code Online (Sandbox Code Playgroud)
这是我如何切片:
In [48]: lat_bnd = [25,30] …Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以将 xarray 数据集展平为单个 1D numpy 数组?
例如,展平以下测试数据集:
xr.Dataset({
'a' : xr.DataArray(
data=[10,11,12,13,14],
coords={'x':[0,1,2,3,4]},
dims={'x':5}
),
'b' : xr.DataArray(data=1,coords={'y':0}),
'c' : xr.DataArray(data=2,coords={'y':0}),
'd' : xr.DataArray(data=3,coords={'y':0})
})
Run Code Online (Sandbox Code Playgroud)
到
[10,11,12,13,14,1,2,3]
Run Code Online (Sandbox Code Playgroud)
?
到目前为止,我已经尝试过:
xr.open_dataset使用chunksarg,它将数据加载到内存中。NetCDF4DataStore,然后调用ds['field'].values,它将数据加载到内存中。ScipyDataStore与mmap='r'和ds['field'].values数据加载到内存中。从我所看到的情况来看,该设计似乎不围绕在内存映射的数组上实际应用numpy函数,而是将小块加载到内存中(有时使用内存映射来实现)。例如,此注释。而有些相关评论点击这里了解不xarray不能够确定一个numpy的阵列是否mmapped与否。
我希望能够将数据表示和切片为xarray.Dataset,并能够调用.values(或.data)以获取ndarray,但仍将其映射(为共享内存等目的)。
如果分块的dask操作至少可以在内存映射的数组上运行,直到它实际上需要进行某些更改,这也是很好的,因为dask似乎是围绕不可变数组设计的,因此这似乎是可能的。
我确实找到了xarray的窍门,就是这样做的:
data=np.load('file.npy', mmap_mode='r')
ds=xr.Dataset({'foo': (['dim1', 'dim2'], data)})
Run Code Online (Sandbox Code Playgroud)
在这一点上,类似以下内容的工作无需将任何内容加载到内存中:
np.sum(ds['foo'].values)
np.sum(ds['foo'][::2,:].values)
Run Code Online (Sandbox Code Playgroud)
... xarray显然不知道该数组是否被映射,因此无法承受np.copy此类情况。
是否存在“受支持的”方式在xarray或dask中进行只读映射(或对此事进行复制复制)?
我想获取栅格(卫星图像)数据,并构建一个DatasetorDataArray来加速我的图像处理(我必须经常处理多波段、多日期的卫星图像)。
数据是每个图像日期的单独波段,我了解如何将每个波段日期转换为 xarray- DataArray。我认为每个波段都有一个变量是最有意义的,并且在每个波段内都有空间 (x, y) 和时间维度。
但是,我无法弄清楚如何做到这一点。
我一直在与一些虚拟乐队合作试图解决这个问题,因此将包括在内以澄清我的数据是什么样子以及我正在尝试做什么。
# Set up dummy 3 x 3 array
dA = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Create 4 dummy images; 2 bands for each of 2 dates (using bands 4 and 5,
# because they're useful for vegetation measures)
d1_b4 = xr.DataArray((dA + 140),
coords={'x': ['1', '2', '3'], 'y': ['a', 'b', 'c']}, dims=('x', 'y'))
d1_b5 = xr.DataArray((dA + 150),
coords={'x': ['1', '2', …Run Code Online (Sandbox Code Playgroud) 我有一个 xarray 数据集 ds
<xarray.Dataset>
Dimensions: (elevation_band: 4, latitude: 1, longitude: 1)
Coordinates:
* longitude (longitude) float64 -111.4
* latitude (latitude) float64 44.51
* elevation_band (elevation_band) int32 1 2 3 4
Data variables:
area_frac (elevation_band, latitude, longitude) float64 0.005109 ...
mean_elev (elevation_band, latitude, longitude) float64 2.45e+03 ...
prec_frac (elevation_band, latitude, longitude) float64 0.005109 ...
Run Code Online (Sandbox Code Playgroud)
我想mean_elev用[0.1, 0.2, 0.3, 0.4]导致此错误的这些值替换 的值:
ds['mean_elev'].values = np.atleast_3d([0.1, 0.5, 0.3, 0.6]).reshape((4, 1, 1))
Run Code Online (Sandbox Code Playgroud)
MissingDimensionsError: cannot set variable 'mean_elev' …
有没有办法使用xarray创建时间维度超过2263年的netCDF文件?
以下是如何创建netCDF玩具数据集http://xarray.pydata.org/en/stable/time-series.html
但是,时间维度有一种pandas日期时间索引,并且不会超出2263,如下所示:https: //github.com/pandas-dev/pandas/issues/13346
我有一个netCDF文件,其中包含一个名为var2001-01-01到2010-12-31 的变量的每日数据.我想计算每月总和,var得到一个包含12个时间步长的netCDF(一年中每个月一个).目前,我这样做:
import xarray as xr
hndl_fl = xr.open_dataset(path_file)
hndl_fl.resample('1MS', dim='time', how='sum')
Run Code Online (Sandbox Code Playgroud)
然而,这导致netCDF每月从2001年到2010年的每月总和.我如何获得12个月的月平均值?
xarray ×10
python ×9
netcdf ×2
numpy ×2
pandas ×2
dask ×1
multi-index ×1
numpy-memmap ×1
raster ×1
rasterio ×1