标签: python-xarray

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
查看次数

沿 XArray 的时间维度应用函数

我有一个图像堆栈存储在尺寸为时间、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)

dask python-xarray

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

查找满足条件的 xarray 索引

我想获取满足某些条件的 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)

即使我正在执行相同的命令,这也不会返回我链接到的示例中所示的位置。我不知道为什么。

python python-xarray

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

如何找到与 xarray 的特定选择等效的索引?

我有一个 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)

但我不确定这是否是正确的方法。我怎样才能“正确”地做到这一点?

python python-xarray

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

使用 Xarray 和 Dask 加快选择组合 netCDF 文件中的元素

我是 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)

dask python-xarray

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

在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万
查看次数