标签: python-xarray

将新坐标添加到 xarray.DataArray

假设以下代码具有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 文档非常稀疏,不知道我做错了什么。

python python-xarray

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

从 NETCDF 文件中提取数据的有效方法

我有许多坐标(大约 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)

python netcdf nco python-xarray cdo-climate

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

Xarray:切片坐标返回空维度

社区!

\n

在处理气候模拟模型的输出时,我遇到了一些奇怪的 xarray 行为 - 按纬度切片返回一个空数组。

\n
xr.open_mfdataset(nc_list[1])\n
Run 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)

python-xarray

7
推荐指数
0
解决办法
550
查看次数

如何更改 xarray.Dataset 维度的顺序?

我正在创建一个 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})而不更改其他任何内容(一切都将相同,只是维度的顺序发生了变化)?

dataset dimensions python-xarray

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

xarray自动将_FillValue应用于netCDF输出的坐标

我正在尝试创建一个兼容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)

python netcdf python-xarray

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

在python中修改xarray图图例

我刚开始使用 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,但到目前为止我无法找到有关它的信息。有什么建议么?:)

python plot python-xarray

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

将 DataArray 转换为 DataFrame 并保留坐标标签顺序

有没有一种简单的方法可以将 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)

pandas python-xarray

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

Xarray 长格式到宽格式 - 相当于 Pandas 的枢纽

我正在寻找一种在 Xarray 中制作数据透视表的方法,类似于 Pandas.pivotset_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 支持。

python pandas python-xarray

6
推荐指数
0
解决办法
602
查看次数

通过 3-D xarray.Dataset 绘制切片

我想通过 3-D xarray.Dataset 绘制一个切片,如下所示:

3-D netcdf 坐标的可视化

我们想要绘制的二维切片

这就是我开始的方式(为简单起见,使用教程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)

arrays numpy python-xarray

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

AttributeError:模块“numpy.random”在 python 3.8.10 中没有属性“BitGenerator”

我试图将 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)

numpy python-module attributeerror python-3.x python-xarray

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