标签: python-xarray

将“时间”维度添加到 xarray 数据集并将另一个数据集中的坐标分配给它

我有一个名为 的数据集对象(通过 netCDF 文件导入xarray.open_datasetds。它包含一个名为variable1和的变量latitudelongitude维度。

>>>ds
<xarray.Dataset>
Dimensions:    (latitude: 681, longitude: 841)
Coordinates:
  * latitude   (latitude) float64 -10.0 -10.05 -10.1 ... -43.9 -43.95 -44.0
  * longitude  (longitude) float64 112.0 112.0 112.1 112.2 ... 153.9 153.9 154.0
Data variables:
    variable1     (latitude, longitude) float32 ...
Run Code Online (Sandbox Code Playgroud)

我有一个timeDataArray 对象,其坐标从2017-01-012017-13-31

>>>times = pd.date_range("2017/01/01","2018/01/01",freq='D',closed='left')
>>>time_da = xr.DataArray(times, [('time', times)])
>>>time_da
<xarray.DataArray (time: 365)>
array(['2017-01-01T00:00:00.000000000', '2017-01-02T00:00:00.000000000',
       '2017-01-03T00:00:00.000000000', ..., '2017-12-29T00:00:00.000000000',
       '2017-12-30T00:00:00.000000000', '2017-12-31T00:00:00.000000000'],
      dtype='datetime64[ns]') …
Run Code Online (Sandbox Code Playgroud)

numpy python-xarray

4
推荐指数
1
解决办法
9288
查看次数

xarray 计算多年 netcdf 的月平均值

我有一个来自 ERA5 的 2m 温度 netcdf 文件,该文件从 2000 年到 2019 年的 04 到 10 个月,总共提供 13680 个时间步长和 61x161 经纬度维度。我想分别计算每年所有每日时间步长的月平均值。例如,我们将获得 2000 年 4 月、2000 年 5 月等数据的月平均值。我已尝试使用 xarray resample 使用以下代码,但出现两个问题。

\n
    \n
  1. 出于某种原因,平均值似乎多年来都是平均值。
  2. \n
  3. 重采样函数创建月份 01、02、03、11 和 12,尽管没有数据!
  4. \n
\n

这是我\xe2\x80\x99m 谈论的内容:

\n
import xarray as xr\nds = xr.open_dataset(netcdf)\nmonthly_data=ds.resample(time='1M').mean()\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以查看显示每月时间步长的时间戳,包括不相关的月份。

\n
print(np.array(monthly_data.time))\narray(['2000-04-30T00:00:00.000000000', '2000-05-31T00:00:00.000000000',\n       '2000-06-30T00:00:00.000000000', '2000-07-31T00:00:00.000000000',\n       '2000-08-31T00:00:00.000000000', '2000-09-30T00:00:00.000000000',\n       '2000-10-31T00:00:00.000000000', '2000-11-30T00:00:00.000000000',\n       '2000-12-31T00:00:00.000000000', '2001-01-31T00:00:00.000000000',\n
Run Code Online (Sandbox Code Playgroud)\n

为了验证温度的内容,我将数据转换为数据帧。

\n
temp_ar = np.array(monthly_data.t2m)    \nprint(pd.DataFrame(temp_ar[0,:,:]).head())\n          0           1           2    ...         158         159         160\n0  270.940613  270.911652  270.926727  ...         NaN …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-xarray

4
推荐指数
1
解决办法
1888
查看次数

对不包含时间维度的文件使用 xarray open_mfdataset

我有一个 NetCDF 文件列表,我想用该xarray.open_mfdataset函数打开它们。

这通常是微不足道的,但是我遇到了一个问题,因为我尝试打开的文件中不包含任何“时间”维度:

data
Out[51]: 
<xarray.Dataset>
Dimensions:  (lat: 850, lon: 1500)
Coordinates:
  * lat      (lat) float64 54.98 54.94 54.9 54.86 ... 21.14 21.1 21.06 21.02
  * lon      (lon) float64 -126.0 -125.9 -125.9 -125.9 ... -66.1 -66.06 -66.02
Data variables:
    Data     (lat, lon) float32 ...
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 open_mfdataset 打开文件列表时,我当然会收到错误:

xr.open_mfdataset(files)

ValueError: Could not find any dimension coordinates to use to order the datasets for concatenation
Run Code Online (Sandbox Code Playgroud)

不过,我确实有一个与每个文件对应的日期列表:

dates
Out[54]: 
array([datetime.datetime(2009, 1, 1, 0, 0),
       datetime.datetime(2009, 1, 2, 0, 0),
       datetime.datetime(2009, …
Run Code Online (Sandbox Code Playgroud)

netcdf python-xarray

4
推荐指数
1
解决办法
3707
查看次数

使用metpy计算比湿度时出错

我想使用metpyERA5 每小时再分析数据来计算近地表(即 2m)比湿度。我metpy昨天刚刚通过 pip 在本地安装,所以我假设我的代码是最新的。我的问题是我不断遇到以下错误。

这是我目前的代码:

# import modules
import numpy as np
import xarray as xr
from metpy.units import units
import metpy.calc as mpcalc

# read data
d2m = xr.open_dataset('netcdf/ERA5_dewpt2m_1992.nc')
sp = xr.open_dataset('netcdf/ERA5_pres_1992.nc')

# assign units (approach 1)
#d2m = d2m*units.kelvin
#sp = sp*units.pascal

# assign units (approach 2)
d2m = units.Quantity(d2m, "kelvin")
sp = units.Quantity(sp, "pascal")

# calculate specific humidity
aqh2m = mpcalc.specific_humidity_from_dewpoint(sp, d2m)
Run Code Online (Sandbox Code Playgroud)

如果我忽略“单位”步骤,那么该函数当然会抱怨缺少单位。请注意,我尝试了两种不同的方法来处理上面的单元,但它们都不起作用。

如果我尝试这种方法:

# assign units (approach 1)
d2m = d2m*units.kelvin …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-xarray metpy era5

4
推荐指数
2
解决办法
1170
查看次数

无法将 y 和 x 坐标分配给 xarray.DataArray

在完成 MetPy 横截面示例后,我尝试将该示例推广到 NCEP NAM-12km GRIB2 文件,但没有成功。通过将我的文件的 DataArray 与示例文件(netCDF 文件)进行比较,我发现 xarray.open_dataset() 没有生成 x 和 y 坐标。它也没有在输入 GRIB 文件中找到足够的信息来生成 metpy_crs 坐标。我尝试将 GRIB 文件转换为 netCDF,但这并没有解决问题。

即使将输入文件视为非 CF 投诉,我发现我无法分配 x 和 y 坐标。通过检查横截面示例中使用的 netCDF 文件,可以清楚地看到 x 和 y 数组表示具有 GeoX 和 GeoY 坐标轴类型的空间网格。然而,我不清楚如何为我的文件创建类似的数组。

纬度和经度数组不适合尝试手动折叠它们(例如选择沿行的纬度模式,这是我创建适当的坐标向量的尝试。)

对于解决此问题的一些帮助将不胜感激。谢谢你!

以下是我正在运行的代码。

import sys
#  pygrib is installed to the "herbie" environment, so we add the path
#  to this so we can load those packages.  Pygrib is used to get the 
#  complete set of keys …
Run Code Online (Sandbox Code Playgroud)

python-xarray metpy

4
推荐指数
1
解决办法
708
查看次数

减去两个 xarray,同时保留所有维度

这可能是最基本的问题,但我就是找不到解决方案。

我有两个包含风数据的不同 xarray。两个 xarray 都有维度(时间:60,普列夫:19,纬度:90)。我现在需要在所有维度上获取两个 xarray 之间的差异,以找到两个场景之间的异常。

我认为 xarray.DataArray.diff 函数仅用于计算沿一个 xarray 的轴的差异(而不是计算两个 xarray 之间的差异)。

所以,我尝试简单地使用

diff = wind1_xarray - wind2_xarray
Run Code Online (Sandbox Code Playgroud)

diff = (wind1_xarray - wind2_xarray).compute() 
Run Code Online (Sandbox Code Playgroud)

然而,这两种方法都给了我一个具有尺寸的xarray(时间:60,plev:0,lat:90)。为什么在计算差异时会丢失压力水平?

如何计算两个 xarray 在所有维度上的差异而不丢失一维?

感谢大家

python dimensions difference python-xarray

4
推荐指数
1
解决办法
4282
查看次数

有人可以解释 xarray.polyfit 系数背后的逻辑吗?

我正在尝试对 Netcdf 文件中的气候数据进行线性回归。数据如下所示..

print(dsloc_lvl)
<xarray.DataArray 'sla' (time: 10227)>
array([0.0191, 0.0193, 0.0197, ..., 0.0936, 0.0811, 0.0695])
Coordinates:
    latitude   float32 21.62
  * time       (time) datetime64[ns] 1993-01-01 1993-01-02 ... 2020-12-31
    longitude  float32 -89.12
Attributes:
    ancillary_variables:  err_sla
    comment:              The sea level anomaly is the sea surface height abo...
    grid_mapping:         crs
    long_name:            Sea level anomaly
    standard_name:        sea_surface_height_above_sea_level
    units:                m
    _ChunkSizes:          [ 1 50 50]``

Run Code Online (Sandbox Code Playgroud)

我一直在使用 Xarray 库来处理数据,因此我使用了 xarray.DataArray.polyfit 和 xarray.DataArray.polyval。绘制结果时,回归线看起来不错。

然而,当研究系数时,我注意到它们非常小。我将系数与 np.polyfit 方法进行了比较,该方法与预期一致。我认为这是因为对于 np. ppolyfit 我使用 date2num 转换日期

x1=mdates.date2num(dsloc_lvl['time'])
Out: array([ 8401.,  8402.,  8403., ..., …
Run Code Online (Sandbox Code Playgroud)

python numpy linear-regression python-xarray

4
推荐指数
1
解决办法
1084
查看次数

展开尺寸xarray

是否存在扩展xarray.DataArray对象尺寸(和坐标)的方法?

我想获得类似于np.expand_dims的内容,同时为新的expand定义新的尺寸和坐标变量DataArray

使用DataArray.assign_coords()I可以创建一个新的坐标变量,但是不会使用新轴扩展数组本身。

python numpy dimension multidimensional-array python-xarray

3
推荐指数
2
解决办法
2141
查看次数

从xarray数据集中的某些变量中删除维

我有一个xarray数据集,其中一些变量具有比必要更多的维度(例如,"纬度"和"经度"变量也随时间变化的3D数据集).如何删除额外的尺寸?

例如,在下面的数据集中,"bar"是沿轴xy轴的2D变量,沿轴具有恒定的vaues x.如何x从'bar'中删除尺寸而不是'foo'?

>>> ds = xr.Dataset({'foo': (('x', 'y'), np.random.randn(2, 3))},
                    {'x': [1, 2], 'y': [1, 2, 3],
                     'bar': (('x', 'y'), [[4, 5, 6], [4, 5, 6]])})
>>> ds
<xarray.Dataset>
Dimensions:  (x: 2, y: 3)
Coordinates:
  * x        (x) int64 1 2
  * y        (y) int64 1 2 3
    bar      (x, y) int64 4 5 6 4 5 6
Data variables:
    foo      (x, y) float64 -0.9595 0.6704 -1.047 0.9948 0.8241 1.643
Run Code Online (Sandbox Code Playgroud)

python-xarray

3
推荐指数
1
解决办法
2745
查看次数

堆叠从Xarray生成的Dask数组的有效方法

因此,我正在尝试读取大量包含水文数据的相对较大的netCDF文件。NetCDF文件全部如下所示:

<xarray.Dataset>
Dimensions:         (feature_id: 2729077, reference_time: 1, time: 1)
Coordinates:
  * time            (time) datetime64[ns] 1993-01-11T21:00:00
  * reference_time  (reference_time) datetime64[ns] 1993-01-01
  * feature_id      (feature_id) int32 101 179 181 183 185 843 845 847 849 ...
Data variables:
    streamflow      (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
    q_lateral       (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
    velocity        (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
    qSfcLatRunoff   (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
    qBucket         (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
    qBtmVertRunoff  (feature_id) float64 dask.array<shape=(2729077,), chunksize=(50000,)>
Attributes:
    featureType:                timeSeries
    proj4:                      +proj=longlat +datum=NAD83 +no_defs
    model_initialization_time:  1993-01-01_00:00:00
    station_dimension:          feature_id
    model_output_valid_time:    1993-01-11_21:00:00
    stream_order_output: …
Run Code Online (Sandbox Code Playgroud)

python netcdf dask python-xarray

3
推荐指数
1
解决办法
285
查看次数