我有大约 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 的新手,正在努力弄清楚如何做到这一点。
我从试图过渡Pandas到Xarray为N-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 attribute用mean,所以我用一个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) 我有一个数据集,它包含了几年的每日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)
但我觉得应该有更优雅的解决方案.有任何想法吗?
我有一个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'代替.我可以添加任何我可能遗漏的细节.
谢谢
我有一个具有土地覆盖类型的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) 我正在DataArray沿着时间维度从多个切片创建一个,并'index must be monotonic for resampling'在尝试重新采样时偶然发现了错误,我猜我的时间索引没有排序。我没有注意它们的顺序concat()。
# TODO: sort instead of raising an error
将在引发错误的代码中找到。
我的问题:我将如何DataArray在 a 中对我的s的索引进行排序DataSet?我找不到类似的东西sort_index()。
以下是哲学问题,旨在弄清楚为什么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没有任何问题?如果这是我想要的行为,我应该以其他方式这样做并忽略错误吗?
我有一个使用多维坐标的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) 我正在读取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) 我xr.DataArray从OpenDataCube查询返回了相当大的1000 x 4000像素,并且有一大组(> 200,000)xy点值。我需要对数组进行采样以在每个xy点下返回一个值,并返回内插的值(例如,如果该点降落在a 0和1.0像素之间的中间位置,则返回的值应该是0.5)。
xr.interp让我可以轻松地对插值进行采样,但是它返回所有x和y值的每个组合的巨大矩阵,而不仅仅是返回每个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)
目前的方法 …