假设以下代码具有xarray.DataArray二维和坐标:
import numpy as np
from xarray import DataArray
data = np.random.rand(10, 4)
f_names = ['a', 'b', 'c', 'd']
sample_weights = np.random.rand(10)
rows = list(range(len(data)))
coords={'samples': rows,
'features': f_names,
'sample_weights': ('samples', sample_weights)}
xdata = DataArray(data, coords=coords,
dims=['samples', 'features'])
subset = xdata[::2]
Run Code Online (Sandbox Code Playgroud)
现在我想添加另一个坐标,alternate_sample_weights例如subset. 我尝试:
subset.assign_coords(alternate_sample_weights=np.zeros(5)
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
ValueError: cannot add coordinates with new dimensions to a DataArray
Run Code Online (Sandbox Code Playgroud)
API 文档非常稀疏,不知道我做错了什么。
我有许多坐标(大约 20000 个),我需要从许多 NetCDF 文件中提取数据,每个文件大约有 30000 个时间步长(未来的气候情景)。使用此处的解决方案效率不高,原因是每个 i,j 将“dsloc”转换为“dataframe”所花费的时间(请查看下面的代码)。** 可以从此处下载 NetCDF 文件示例**
import pandas as pd
import xarray as xr
import time
#Generate some coordinates
coords_data = [{'lat': 68.04, 'lon': 15.20, 'stid':1},
{'lat':67.96, 'lon': 14.95, 'stid': 2}]
crd= pd.DataFrame(coords_data)
lat = crd["lat"]
lon = crd["lon"]
stid=crd["stid"]
NC = xr.open_dataset(nc_file)
point_list = zip(lat,lon,stid)
start_time = time.time()
for i,j,id in point_list:
print(i,j)
dsloc = NC.sel(lat=i,lon=j,method='nearest')
print("--- %s seconds ---" % (time.time() - start_time))
DT=dsloc.to_dataframe()
DT.insert(loc=0,column="station",value=id)
DT.reset_index(inplace=True)
temp=temp.append(DT,sort=True)
print("--- …Run Code Online (Sandbox Code Playgroud) 社区!
\n在处理气候模拟模型的输出时,我遇到了一些奇怪的 xarray 行为 - 按纬度切片返回一个空数组。
\nxr.open_mfdataset(nc_list[1])\nRun Code Online (Sandbox Code Playgroud)\n输出
\n<xarray.Dataset>\nDimensions: (bnds: 2, time: 1128, lev: 13, lat: 360, lon: 720)\nCoordinates:\n * bnds (bnds) float64 0.0 1.0\n * time (time) float64 4.14e+03 4.141e+03 ... 5.266e+03 5.267e+03\n * lev (lev) float64 1.0 2.0 3.0 4.0 5.0 ... 9.0 10.0 11.0 12.0 13.0\n * lat (lat) float64 89.75 89.25 88.75 ... -88.75 -89.25 -89.75\n * lon (lon) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nData variables:\n depth (time, lev, lat, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个 xarray 数据集,如下所示:
import numpy as np
import xarray as xr
x_example = np.random.rand(1488,)
y_example = np.random.rand(1331,)
time_example = np.random.rand(120,)
rainfall_example = np.random.rand(120, 1331, 1488)
rainfall_dataset = xr.Dataset(
data_vars=dict(
rainfall_depth=(['time', 'y', 'x'], rainfall_example),
),
coords=dict(
time=(['time'], time_example),
x=(['x'], x_example),
y=(['y'], y_example)
)
)
Run Code Online (Sandbox Code Playgroud)
结果是这样的
而我跑步时的尺寸rainfall_example.dims是这样的Frozen({'time': 120, 'y': 1331, 'x': 1488})(这也可以从上面的结果中看出)。我知道xarray.Dataset.dims不能根据这里修改
我的问题是:我们如何才能将这些维度的顺序更改为这样的维度Frozen({'time': 120, 'x': 1488, 'y': 1331})而不更改其他任何内容(一切都将相同,只是维度的顺序发生了变化)?
我正在尝试创建一个兼容cf的netcdf文件.我可以得到大约98%cf与xarray兼容但是我遇到了一个问题.当我在我正在创建的文件上执行ncdump时,我看到以下内容:
float lon(lon) ;
lon:_FillValue = NaNf ;
lon:long_name = "Longitude" ;
lon:standard_name = "longitude" ;
lon:short_name = "lon" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
lon:valid_min = -180.f ;
lon:valid_max = 180.f ;
float lat(lat) ;
lat:_FillValue = NaNf ;
lat:long_name = "Latitude" ;
lat:standard_name = "latitude" ;
lat:short_name = "lat" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
lat:valid_min = -90.f ;
lat:valid_max = 90.f ;
double time(time) ;
time:_FillValue = NaN ;
time:standard_name = …Run Code Online (Sandbox Code Playgroud) 我刚开始使用 xarray 的绘图功能,我通常使用 matplotlib。
我正在尝试移动 xarray.plot.scatter 创建的图例。能够删除图例标题也很酷。
data.plot.scatter(x = 'HGT', y = var, hue = 'time', add_guide = True)
Run Code Online (Sandbox Code Playgroud)
如果我通过 ax.legend 制作单独的图例,当 add_guide = False 时,我的图例顺序会变得混乱。我的绘图用不同的颜色标记不同的时间对(hours2 - hours1),并且顺序对于易于理解非常重要。
ax.legend(labels, bbox_to_anchor=(-1.15, 2.4, -1., .102), loc='lower left', ncol = 6)
Run Code Online (Sandbox Code Playgroud)
因此,我试图更好地了解如何修改图例 xarray.plot.scatter,但到目前为止我无法找到有关它的信息。有什么建议么?:)
有没有一种简单的方法可以将 xarray DataArray 转换为 pandas DataFrame,我可以在其中指定将哪些维度转换为索引/列?例如,假设我有一个 DataArray
import xarray as xr
weather = xr.DataArray(
name='weather',
data=[['Sunny', 'Windy'], ['Rainy', 'Foggy']],
dims=['date', 'time'],
coords={
'date': ['Thursday', 'Friday'],
'time': ['Morning', 'Afternoon'],
}
)
Run Code Online (Sandbox Code Playgroud)
结果是:
<xarray.DataArray 'weather' (date: 2, time: 2)>
array([['Sunny', 'Windy'],
['Rainy', 'Foggy']], dtype='<U5')
Coordinates:
* date (date) <U8 'Thursday' 'Friday'
* time (time) <U9 'Morning' 'Afternoon'
Run Code Online (Sandbox Code Playgroud)
假设我现在想将其移动到按日期索引的 pandas DataFrame,其中包含时间列。我可以通过使用.to_dataframe()然后.unstack()在生成的数据帧上来做到这一点:
<xarray.DataArray 'weather' (date: 2, time: 2)>
array([['Sunny', 'Windy'],
['Rainy', 'Foggy']], dtype='<U5')
Coordinates:
* date (date) <U8 'Thursday' 'Friday' …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在 Xarray 中制作数据透视表的方法,类似于 Pandas.pivot或set_index([...]).unstack().
基本上,我有一些包含 3 列的表格数据:
我想(在 Xarray 中)通过旋转或 set_index([...]).unstack()操作将其转换为宽格式,如通过 Pandas 所示:
当然,我可以首先通过 Pandas 将数据从长格式转换为宽格式,然后将其加载到 Xarray 中:
df = pd.DataFrame(data)
df = df.set_index(['price','date']).unstack()
x = xr.DataArray(df.values,dims=("price","date"),
coords={"price":df.index,
"date":df.columns.get_level_values(1)},
attrs={"long_name":"volume","units":'BTC'})
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
但我真的希望有一种方法可以在不使用 Pandas 的情况下完成所有这些工作,因为我还想利用 Xarray 的本机 Dask 支持。
我想通过 3-D xarray.Dataset 绘制一个切片,如下所示:


这就是我开始的方式(为简单起见,使用教程air_temperature数据集)
# import packages
import xarray as xr
import numpy as np
# load dataset
ds = xr.tutorial.open_dataset("air_temperature")
# get slice values
tgt_lon = xr.DataArray(np.linspace(220, 280, num=15), dims="lon")
tgt_lat = xr.DataArray(np.linspace(30, 50, num=15), dims="lat")
# crop to region of interest - this works fine
da = ds.sel(lon=tgt_lon,
lat=tgt_lat,
method="nearest")
Run Code Online (Sandbox Code Playgroud)
现在我们仍然有一个 3-D xarray.Dataset。对于二维绘图,我们希望将经度和纬度堆叠到相对于零点的距离数组(此处:角点 x0/y0,如图所示)。
# zero point: lat_min/lon_min
lon_orig = da.lon.min().values
lat_orig = da.lat.min().values
# stack longitude and latitude -- gives tuple for dist
sta …Run Code Online (Sandbox Code Playgroud) 我试图将 xarray 模块导入 python 3.8.10 但出现此错误:
AttributeError: module 'numpy.random' has no attribute 'BitGenerator'
为了让您重现错误:首先,我使用 conda 创建了一个新环境,并同时导入了我需要的模块(以避免依赖项不兼容的问题):
conda create -n Myenv Python=3.8 matplotlib numpy time xarray netCDF4 termcolor
然后,我尝试在 ipython3 中导入运行代码所需的所有模块:
import matplotlib as mpl
mpl.use('agg')
import numpy as np
import os
import time
import glob
import sys
from datetime import datetime,date,timedelta
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
import matplotlib.colors as colors
# from operator import itemgetter
from netCDF4 import Dataset
from mpl_toolkits.basemap import Basemap, shiftgrid
from termcolor import …Run Code Online (Sandbox Code Playgroud) python-xarray ×10
python ×5
netcdf ×2
numpy ×2
pandas ×2
arrays ×1
cdo-climate ×1
dataset ×1
dimensions ×1
nco ×1
plot ×1
python-3.x ×1