标签: python-xarray

如何添加时间维度并从栅格堆栈创建 xarray 数据集/数据数组?

我有大约 75 个完全相同区域的高程二维栅格图 (tif),每个都是在不同时间获取的。我想使用 来堆叠这些xarray。我可以读取每个栅格(见下文),但目前没有时间坐标,因为我需要从每个文件的标题中提取时间(下面的文件中的 2017-02-15T06:13:38Z)。

da = xr.open_rasterio('tifs/DTSLOS_20170122_20190828_D79H_2017-02-15T06:13:38Z.tif')
da
<xarray.DataArray (y: 12284, x: 17633)>
[216603772 values with dtype=float64]
Coordinates:
    band     int64 1
  * y        (y) float64 59.62 59.62 59.62 59.62 59.62 ... 49.8 49.8 49.8 49.8
  * x        (x) float64 -12.17 -12.17 -12.17 -12.17 ... 1.931 1.932 1.932 1.933
Attributes:
    transform:   (0.0008, 0.0, -12.172852, 0.0, -0.0008, 59.623425)
    crs:         GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,2...
    res:         (0.0008, 0.0008)
    is_tiled:    1
    nodatavals:  (-9999.0,)
Run Code Online (Sandbox Code Playgroud)

我假设我应该解决这个问题的方法是向每个数据数组添加时间,然后堆叠/连接它们,但我是 xarray 的新手,正在努力弄清楚如何做到这一点。

python python-xarray rasterio

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

从2D DataFrame /数组的字典创建DataArray

我从试图过渡PandasXarrayN-Dimensional DataArrays扩大我的剧目。

实际上,我要pd.DataFrames沿特定轴(下面的模拟示例中的患者)合并一些不同的轴(在本例中为row = month,col = attribute)(我不希望使用面板或multindex) :), 谢谢)。我想将它们转换为xr.DataArrays以便可以在其上建立尺寸。我制作了一个模拟数据集,以大致了解我在说什么。

对于我组成的这个数据集,想象一下100 patients, 12 months, 10000 attributes, 3 replicates (per attribute)它将是一个典型的4D数据集。基本上,我冷凝3 replicates per attributemean,所以我用一个2D结束pd.DataFrame(行=月,COL =属性)这个数据帧是在我的字典和它来自病人的价值是关键(即(patient_x:DataFrame_X))

我还将介绍一轮关于使用np.ndarray占位符的方法,但是如果我可以从字典中生成一个N维的DataArray,该字典的键为Patient_x,其值为DataFrame_X,这将非常方便

如何DataArray使用Xarray的字典创建N维Pandas DataFrames

import xarray as xr
import numpy as np
import pandas as pd

np.random.seed(1618033)

#Set dimensions
a,b,c,d = 100,12,10000,3 #100 patients, 12 months, 10000 attributes, 3 replicates

#Create …
Run Code Online (Sandbox Code Playgroud)

python dictionary dataframe pandas python-xarray

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

仅使用冬季数据将xarray数据集重新采样为年度频率

我有一个数据集,它包含了几年的每日x,y网格气象数据.我有兴趣只计算冬季数据的年度平均值,即.不包括夏季数据.

我认为我需要使用resample命令,例如频率AS-OCT将时间序列重新采样到年频率,冬季从每年10月开始(北纬).

我无法解决的是如何指定我只想使用10月到4月/ 5月的数据,忽略6月,7月和8月.

由于resample函数与ndarray对象一起工作,我提出了一个相当不可靠的方法来实现这个:

def winter(x,axis):
    # Only use data from 1 October to end of April (day 211)
    return np.sum(x[0:211,:,:],axis=0)
win_sum = all_data.resample('AS-OCT',how=winter,dim='TIME')
Run Code Online (Sandbox Code Playgroud)

但我觉得应该有更优雅的解决方案.有任何想法吗?

python python-xarray

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

根据特定月份选择xarray/pandas索引

我有一个xarray DataArray,我想在整个时间序列中选择四月,五月,六月(类似于time.season =='JJA').

其结构如下:

<xarray.DataArray 't2m' (time: 492, latitude: 81, longitude: 141)>
Run Code Online (Sandbox Code Playgroud)

我以前选择JJA:

seasonal_data =temp_data.sel(time=temp_data['time.season']=='JJA')
Run Code Online (Sandbox Code Playgroud)

我想做同样的事情,但用'AMJ'代替.我可以添加任何我可能遗漏的细节.

谢谢

python numpy pandas python-xarray

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

具有多个条件的xarray.where()

我有一个具有土地覆盖类型的dataArray。我想掩盖列表中的某些值。是否可以在多个条件下使用xr.where()函数?

import numpy as np
import xarray as xr
a = xr.DataArray(np.arange(25).reshape(5, 5), dims=('x', 'y'))
print a
LC = [10,12,19]
a.where((a == LC[0]) | (a == LC[1]))
Run Code Online (Sandbox Code Playgroud)

这使:

 <xarray.DataArray (x: 5, y: 5)>
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
Coordinates:
  * x        (x) int64 0 1 2 3 4
  * y        (y) int64 0 1 2 3 4

<xarray.DataArray …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

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

如何对 xarray Dataset/DataArray 的索引进行排序?

我正在DataArray沿着时间维度从多个切片创建一个,并'index must be monotonic for resampling'在尝试重新采样时偶然发现了错误,我猜我的时间索引没有排序。我没有注意它们的顺序concat()

# TODO: sort instead of raising an error

将在引发错误的代码中找到。

我的问题:我将如何DataArray在 a 中对我的s的索引进行排序DataSet?我找不到类似的东西sort_index()

python pandas python-xarray

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

为什么在python xarray for nan中抛出'更大'中遇到的无效值?难道南不应该没有任何问题吗?

以下是哲学问题,旨在弄清楚为什么xarray是它的方式.


我无法弄清楚Xarrays如何做以下事情.

positive_values = values.where(values > 0)  
Run Code Online (Sandbox Code Playgroud)

它遵循x-arrays语法,并使用xarrays计算我想要它做什么,但抛出此运行时警告.

RuntimeWarning: invalid value encountered in greater if not reflexive  
Run Code Online (Sandbox Code Playgroud)

我的问题是,我如何滥用Xarrays

我想说nans的是他们在各个操作中通勤的意义上的优秀案例.(可以轻松发现或处理缺失的数据值)

IE浏览器.

value = np.nan + 1  
final_value = value/2  
#final_value evaluates to 'nan'
Run Code Online (Sandbox Code Playgroud)

这使得它们在X阵列中的表示非常有用.xarrays可能缺少数据,但这不应该阻止数千个点的操作.

为什么不>通过nan没有任何问题?如果这是我想要的行为,我应该以其他方式这样做并忽略错误吗?

numpy python-xarray

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

如何使用python xarray使用多维坐标子集数据?

我有一个使用多维坐标的netcdf文件。我的xarray数据集看起来像这样

<xarray.Dataset>
Dimensions:           (Time: 48, bottom_top: 50, bottom_top_stag: 51, 
soil_layers_stag: 4, south_north: 1015, south_north_stag: 1016, west_east: 1359, west_east_stag: 1360)
Coordinates:
XLAT              (Time, south_north, west_east) float32 18.1363 18.1456 ...
XLAT_U            (Time, south_north, west_east_stag) float32 18.1316 ...
XLAT_V            (Time, south_north_stag, west_east) float32 18.1198 ...
XLONG             (Time, south_north, west_east) float32 -122.884 ...
XLONG_U           (Time, south_north, west_east_stag) float32 -122.901 ...
XLONG_V           (Time, south_north_stag, west_east) float32 -122.879 ...
  * Time              (Time) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 …
Run Code Online (Sandbox Code Playgroud)

python arrays subset multidimensional-array python-xarray

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

在XArray中删除重复时间

我正在读取NetCDF文件open_mfdataset,其中包含重复的时间。对于每个重复时间,我只想保留第一次出现的时间,然后丢弃第二次出现的时间(永远不会再出现)。这个问题与Pandas问题非常相似,但是那里提供的所有解决方案似乎都无法与Xarray一起使用。

重现该问题:

import numpy as np
import netCDF4 as nc4
import xarray as xr

# Create example NetCDF files
for t in range(2):
    nc    = nc4.Dataset('test{}.nc'.format(t), 'w')
    dim_t = nc.createDimension('time', None)
    var_t = nc.createVariable('time', 'f8', ('time',))
    var_s = nc.createVariable('var', 'f8', ('time',))
    var_t.setncattr('units', 'hours since 2001-01-01 00:00:00')
    var_t[:] = t*5+np.arange(6)
    var_s[:] = t*5+np.arange(6)+t
    nc.close()

# Read with xarray
f = xr.open_mfdataset(['test0.nc', 'test1.nc'])
Run Code Online (Sandbox Code Playgroud)

结果中的时间dataset为:

array(['2001-01-01T00:00:00.000000000', '2001-01-01T01:00:00.000000000',
       '2001-01-01T02:00:00.000000000', '2001-01-01T03:00:00.000000000',
       '2001-01-01T04:00:00.000000000', '2001-01-01T05:00:00.000000000',
       '2001-01-01T05:00:00.000000000', '2001-01-01T06:00:00.000000000',
       '2001-01-01T07:00:00.000000000', '2001-01-01T08:00:00.000000000',
       '2001-01-01T09:00:00.000000000', '2001-01-01T10:00:00.000000000'], …
Run Code Online (Sandbox Code Playgroud)

netcdf python-xarray

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

根据大量xy点从2D数组中提取插值

xr.DataArrayOpenDataCube查询返回了相当大的1000 x 4000像素,并且有一大组(> 200,000)xy点值。我需要对数组进行采样以在每个xy点下返回一个值,并返回内插的值(例如,如果该点降落在a 01.0像素之间的中间位置,则返回的值应该是0.5)。

xr.interp让我可以轻松地对插值进行采样,但是它返回所有xy值的每个组合的巨大矩阵,而不仅仅是返回每个xy点本身的值。我尝试使用np.diagonal来提取xy点值,但这很慢,很快会遇到内存问题,并且由于我仍然需要等待通过插值的每个组合,因此效率很低xr.interp

可复制的例子

(仅使用10,000个采样点(理想情况下,我需要的东西可以扩展到> 200,000或更多):

# Create sample array
width, height = 1000, 4000
val_array = xr.DataArray(data=np.random.randint(0, 10, size=(height, width)).astype(np.float32),
                         coords={'x': np.linspace(3000, 5000, width),
                                 'y': np.linspace(-3000, -5000, height)}, dims=['y', 'x'])

# Create sample points
n = 10000
x_points = np.random.randint(3000, 5000, size=n)
y_points = np.random.randint(-5000, -3000, size=n)
Run Code Online (Sandbox Code Playgroud)

目前的方法 …

python interpolation numpy scipy python-xarray

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