我正在尝试创建一个兼容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) 我有一个图像堆栈存储在尺寸为时间、x、y 的 XArray DataArray 中,我想在其中沿每个像素的时间轴应用自定义函数,以便输出是尺寸为 x、y 的单个图像。
我尝试过: apply_ufunc 但该函数失败,说明我需要首先将数据加载到 RAM 中(即无法使用 Dask 数组)。理想情况下,我希望在内部将 DataArray 保留为 Dask 数组,因为不可能将整个堆栈加载到 RAM 中。确切的错误消息是:
ValueError: apply_ufunc 在参数上遇到 dask 数组,但尚未启用 dask 数组的处理。设置参数或首先使用或
dask将数据加载到内存中.load().compute()
我的代码目前如下所示:
import numpy as np
import xarray as xr
import pandas as pd
def special_mean(x, drop_min=False):
s = np.sum(x)
n = len(x)
if drop_min:
s = s - x.min()
n -= 1
return s/n
times = pd.date_range('2019-01-01', '2019-01-10', name='time')
data = xr.DataArray(np.random.rand(10, 8, 8), dims=["time", "y", "x"], coords={'time': times}) …Run Code Online (Sandbox Code Playgroud) 我想获取满足某些条件的 xarray 数据数组的索引。相关线程(此处)中提供的有关如何找到最大值位置的答案对我来说也不起作用。就我而言,我也想找出其他类型条件的位置,而不仅仅是最大值。这是我尝试过的:
h=xr.DataArray(np.random.randn(3,4))
h.where(h==h.max(),drop=True).squeeze()
# This is the output I got:
<xarray.DataArray ()>
array(1.66065694)
Run Code Online (Sandbox Code Playgroud)
即使我正在执行相同的命令,这也不会返回我链接到的示例中所示的位置。我不知道为什么。
我有一个 xarray 数据集。
<xarray.Dataset>
Dimensions: (lat: 92, lon: 172, time: 183)
Coordinates:
* lat (lat) float32 4.125001 4.375 4.625 ... 26.624994 26.874996
* lon (lon) float32 nan nan nan ... 24.374996 24.624998 24.875
* time (time) datetime64[ns] 2003-09-01 2003-09-02 ... 2004-03-01
Data variables:
swnet (time, lat, lon) float32 dask.array<shape=(183, 92, 172), chunksize=(1, 92, 172)>
Run Code Online (Sandbox Code Playgroud)
df.sel(time='2003-09-01', lon=6.374997, lat=16.375006, method='nearest')
该特定位置的索引。基本上,row-column在网格中。最简单的方法是什么?
nearestlat=df.sel(time='2003-09-01', lon=6.374997, lat=16.375006, method='nearest')['lat'].values
nearestlon=df.sel(time='2003-09-01', lon=6.374997, lat=16.375006, method='nearest')['lon'].values
rowlat=np.where(df['lat'].values==nearestlat)[0][0]
collon=np.where(df['lon'].values==nearestlon)[0][0]
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是正确的方法。我怎样才能“正确”地做到这一点?
我是 Xarray 和 Dask 的新手,并尝试访问以 3H 间隔存储全球洋流速度的多个 netCDF 文件。每个netCDF文件覆盖一个时间间隔的1/4度分辨率的网格数据:
NetCDF dimension information:
Name: time
size: 1
type: dtype('float32')
_FillValue: 9.96921e+36
units: 'days since 1950-01-01 00:00:00 UTC'
calendar: 'julian'
axis: 'T'
Name: lat
size: 720
type: dtype('float32')
_FillValue: 9.96921e+36
units: 'degrees_north'
axis: 'Y'
Name: lon
size: 1440
type: dtype('float32')
_FillValue: 9.96921e+36
units: 'degrees_east'
axis: 'X'
NetCDF variable information:
Name: eastward_eulerian_current_velocity, northward_eulerian_current_velocity
dimensions: ('time', 'lat', 'lon')
size: 1036800
type: dtype('float32')
_FillValue: 9.96921e+36
coordinates: 'lon lat'
horizontal_scale_range: 'greater than 100 km'
temporal_scale_range: '10 …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
dask ×2
numpy ×2
pandas ×2
arrays ×1
netcdf ×1
plot ×1
python-3.x ×1