标签: python-xarray

python-xarray:计算数据集的绝对值

np.fabsxr.DataArray在' 上工作正常,但xr.Dataset在 ' 上则不然。

data = xr.DataArray(np.random.randn(2, 3), coords={'x': ['a', 'b']}, dims=('x', 'y'))
ds = xr.Dataset({'foo': data, 'bar': ('x', [1, 2]), 'baz': np.pi})
np.fabs(ds)
TypeError: ufunc 'fabs' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
np.fabs(ds['foo'])
<xarray.DataArray 'foo' (x: 2, y: 3)>
array([[ 0.384305,  0.161676,  0.07573 ],
       [ 0.789885,  1.299188,  1.965528]])
Coordinates:
  * x        (x) <U1 'a' 'b'
Dimensions without …
Run Code Online (Sandbox Code Playgroud)

numpy-ufunc python-xarray

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

如何使用 IDW 将 xarray 从高分辨率重新网格化为低分辨率

我使用的是winpython 3.6。我有给定区域的 xarray 数据,如下所示:

sea_clt=clt.sel(lat=slice(-13, 31), lon=slice(89,152))
clt_sea_array=sea_clt[:,:,:]

Out[20]: 
<xarray.DataArray 'clt' (time: 20075, lat: 23, lon: 25)>
[11543125 values with dtype=float32]
Coordinates:
  * lat      (lat) float64 -13.0 -11.0 -9.0 -7.0 -5.0 -3.0 -1.0 1.0 3.0 5.0 ...
  * lon      (lon) float64 91.25 93.75 96.25 98.75 101.2 103.8 106.2 108.8 ...
  * time     (time) datetime64[ns] 1950-01-01T12:00:00 1950-01-02T12:00:00 ...
Run Code Online (Sandbox Code Playgroud)

网格间距为200km*200km(2.0度*2.0度尺度),每日时间序列变量。现在我想为每个时间步以(50km * 50km或0.5度* 0.5度网格比例)重新网格化这些数据。我尝试使用重塑选项但没有成功。我无法得到任何解决方案。如何使用最近邻法或 IDW 等标准方法来做到这一点?任何帮助,将不胜感激。

python python-2.7 python-3.x python-requests python-xarray

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

使用xarray求月平均值

我正在处理GLDAS. 时期的数据重新分析1 year。这些文件是.nc4. 我可以打开文件,但我不能groupby给出1 month。我不想手动或通过 for,但我发现确实xarray如此groupby。我的脚本是:

\n\n
In[16]:import xarray as xr\n\nIn[17]:gldas = xr.open_mfdataset('./GLDAS_2010/*.nc4', chunks=None, concat_dim='time', preprocess=None, engine='netcdf4', lock=None,compat='minimal',coords='minimal',data_vars='minimal')\n\nIn[18]: gldas\nOut[18]: \n<xarray.Dataset>\nDimensions:                (bnds: 2, lat: 40, lon: 48, time: 365)\nCoordinates:\n  * lat                    (lat) float32 -34.875 -34.625 -34.375 -34.125 ...\n  * lon                    (lon) float32 -59.875 -59.625 -59.375 -59.125 ...\n  * time                   (time) float64 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ...\nDimensions without coordinates: bnds\nData variables:\n    Albedo_inst            (time, lat, …
Run Code Online (Sandbox Code Playgroud)

grouping python-3.x python-xarray

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

内存使用过多 xarray `to_dataframe()`

我正在使用 xarray 读取一个相当小的 NetCDF 文件 (5.4MB),并希望将其转换为 Pandas 数据帧:

import xarray as xr
f = xr.open_dataset('file.nc')
Run Code Online (Sandbox Code Playgroud)

到目前为止,Python 使用的内存非常少(~75 MB),但是一旦我调用:

f2 = f.to_dataframe()
Run Code Online (Sandbox Code Playgroud)

内存使用量激增(>12 GB)。有谁知道为什么会发生这种情况?我尝试使用to_dask_dataframe(),但这给我带来了 NetCDF 文件中某些数据类型的错误。

我在这里上传了NetCDF文件,由于我无法分发原始数据,所以原始数据被随机数替换。


按照评论中的要求:

In [3]: f
Out[3]: 
<xarray.Dataset>
Dimensions:          (day_in_time_interval: 3652, nv: 2, time: 175296)
Coordinates:
  * time             (time) datetime64[ns] 2001-01-01 2001-01-01T00:30:00 ...
Dimensions without coordinates: day_in_time_interval, nv
Data variables:
    iso_dataset      |S1 ...
    product          |S1 ...
    station_details  |S1 ...
    date             (time) int32 ...
    valid_dates      (day_in_time_interval) int8 ...
    time_bnds        (time, nv) float32 ...
    C020 …
Run Code Online (Sandbox Code Playgroud)

python netcdf pandas python-xarray

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

如何将二维数组从较粗的分辨率插值到较细的分辨率

假设我有一个形状为 的发射数据(21600,43200),它对应于latlon,即

lat = np.arange(21600)*(-0.008333333)+90
lon = np.arange(43200)*0.00833333-180
Run Code Online (Sandbox Code Playgroud)

我还有一个形状为 的缩放因子(720,1440,7),对应于latlonday of week

lat = np.arange(720)*0.25-90 
lon = np.arange(1440)*0.25-180
Run Code Online (Sandbox Code Playgroud)

现在,我想将该因子应用于排放数据,并且我认为我需要将该因子插值到(720,1440)(21600,43200)。之后,我可以将插值因子与排放数据相乘以获得新的排放输出。

但我对插值方法有困难。有人能给我一些建议吗?

numpy scipy netcdf python-xarray

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

当索引名称具有多个维度时,如何使用 xarray 导入 netCDF4 文件?

当我尝试使用 xarray 导入 netCDF4 文件时,出现以下错误:

MissingDimensionsError:“名称”超过一维且与其维度之一同名(“时间”、“名称”)。xarray 不允许使用此类变量,因为它们与用于标记尺寸的坐标冲突。

但是,我可以使用 netCDF4 python 库成功导入这些数据,并从中获取我需要的数据。问题是这个方法非常慢,所以我正在寻找更快的方法并想尝试 xarray。这是一个示例文件,以及给我带来问题的代码。

from netCDF4 import Dataset
#import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np         
#import seaborn as sns
from tkinter import Tk

from tkinter.filedialog import askdirectory
import os
import xarray as xr

#use this function to get a directory name where the files are
def get_dat():
    root = Tk()
    root.withdraw()
    root.focus_force()
    root.attributes("-topmost", True)      #makes the dialog appear on top
    filename = askdirectory() …
Run Code Online (Sandbox Code Playgroud)

python python-xarray netcdf4

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

从 netCDF 文件读取数据时 Missing_value 属性丢失?

我正在从 NCEP/NCAR Reanalysis 1 的 netCDF 文件中读取风分量(u 和 v)数据来进行一些计算。我正在使用 xarray 来读取文件。

在其中一项计算中,我想屏蔽掉低于某个阈值的所有数据,使它们等于 Missing_value 属性。我不想使用 NaN。

但是,当使用 xarray 读取数据时,missing_value 属性(存在于 netCDF 文件中的变量中)不会复制到包含数据的 xarray.DataArray。

我找不到使用 xarray 从 netCDF 文件变量复制此属性的方法。

这是我正在尝试做的事情的一个例子:

import xarray as xr
import numpy as np

DS1 = xr.open_dataset( "u_250_850_2009012600-2900.nc" )
DS2 = xr.open_dataset( "v_250_850_2009012600-2900.nc" )

u850 = DS1.uwnd.sel( time='2009-01-28 00:00', level=850, lat=slice(10,-60), lon=slice(260,340) )
v850 = DS2.vwnd.sel( time='2009-01-28 00:00', level=850, lat=slice(10,-60), lon=slice(260,340) )

vvel850 = np.sqrt( u850*u850 + v850*v850 )

jet850 = vvel850.where( vvel850 >= 12 )
#jet850 = …
Run Code Online (Sandbox Code Playgroud)

python netcdf missing-data python-xarray

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

在 python 中重新网格 Netcdf 文件

我正在尝试将 NetCDF 文件从 0.125 度重新网格化到 0.083 度空间尺度。netcdf 包含 224 个纬度和 464 个经度,并且包含一年的每日数据。

我尝试了 xarray 但它产生了这个内存错误: MemoryError: Unable to allocate 103. GiB for an array with shape (13858233841,) and data type float64

如何使用 python 重新网格化文件?

python interpolation netcdf python-xarray netcdf4

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

查找 NetCDF 中多个经纬度中心的半径内的值

我有一个 netCDF 文件,其中包含特定时间南半球的多个气旋位置(纬度、经度)和气温。

\n

我想要的是提取距离每个气旋位置中心 10 测地度(约 1110 公里)半径内的温度值 \xe2\x80\x8b\xe2\x80\x8b 。这个想法是确定与每个气旋相关的温度值 \xe2\x80\x8b\xe2\x80\x8b(假设距气旋中心的最大径向距离为 10\xc2\xba),并仅用这些温度绘制一个全局轮廓图价值观。

\n

我在这里搜索了很多,但我只找到了适用于距一个特定纬度中心的距离的代码(例如:如何查找从纬度和经度值的中心位置开始的半径内的值)。

\n

我陷入了如何同时将半正矢公式应用于多个中心的困境。

\n
import xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nd = xr.open_dataset(\'cyc_temp.nc\')\nlat = d[\'lat\']\nlon = d[\'lon\']\ncyc_pos = d[\'id\'][:,:]\ntemp = d[\'temp\'][:,:]\n\n# Haversine formula\n\ndef haversine(lon1, lat1, lon2, lat2):\n    # convert decimal degrees to radians\n    lon1 = np.deg2rad(lon1)\n    lon2 = np.deg2rad(lon2)\n    lat1 = np.deg2rad(lat1)\n    lat2 = np.deg2rad(lat2)\n\n    # haversine formula\n    dlon = lon2 - lon1\n    dlat = lat2 - lat1\n    a = np.sin(dlat/2)**2 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib haversine netcdf python-xarray

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

为什么netcdf文件中的纬度和经度是二维数组?

我有 netCDF 文件,其中包含某个位置的温度数据。数据形状为 1450x900。

我正在我的应用程序中创建搜索功能,以查找具有纬度、经度值的温度数据。

因此,我从 netCDf 文件中提取了纬度和经度坐标数据,但我期望它们是一维数组,而是得到两个坐标形状均为 1450x900 的二维数组。

所以我的问题是:为什么它们是二维数组,而不是 1450 个纬度值和 900 个经度值?1450 纬度值和 900 经度值不是描述整个网格吗?

假设我们有 4x5 的正方形,用于定位网格最右边和最底部点的索引将为 [4, 5]。所以我的 x 索引为 [1, 2, 3, 4],y 索引为:[1, 2, 3, 4, 5]。总共 9 个索引足以定位该网格(由 20 个单元格组成)上的任何点。那么为什么 netcdf 文件中的 lat (x) 和 lon (y) 坐标分别包含 20 个索引(总共 40 个),而不是分别包含 4 个和 5 个索引(总共 9 个)?希望你能明白我困惑的地方。

是否有可能以某种方式映射这些 2D 数组并“降级”到 1450 个纬度值和 900 个经度值?还是像现在这样就可以了?我如何使用这些价值观来实现我的意图?我需要压缩经纬度数组吗?

这是形状:

>>> DS = xarray.open_dataset('file.nc')
>>> DS.tasmin.shape
    (31, 1450, 900)
>>> DS.projection_x_coordinate.shape
    (900,)
>>> DS.projection_y_coordinate.shape
    (1450,)
>>> …
Run Code Online (Sandbox Code Playgroud)

python latitude-longitude coordinates netcdf python-xarray

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