使用 xarray 添加和使用附加坐标
Adding and using additional coordinates with xarray
我正在学习如何使用 python xarray
包,但是,我在处理多维数据时遇到了问题。具体如何添加和使用附加坐标?
这是一个例子。
import xarray as xr
import pandas as pd
import numpy as np
site_id = ['brw','sum','mlo']
dss = []
for site in site_id:
df = pd.DataFrame(np.random.randn(20,2),columns=['a','b'],index=pd.date_range('20160101',periods=20,freq='MS'))
ds = df.to_xarray()
dss.append(ds)
ds = xr.concat(dss, dim=pd.Index(site_id, name='site'))
ds.coords['latitude'] = [71.323, 72.58, 19.5362]
ds.coords['longitude'] = [156.6114, 38.48, 155.5763]
我的 xarray
数据集如下所示:
>>> ds
<xarray.Dataset>
Dimensions: (index: 20, latitude: 3, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
* latitude (latitude) float64 71.32 72.58 19.54
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index) float64 -0.1403 -0.2225 -1.199 -0.8916 0.1149 ...
b (site, index) float64 -1.506 0.9106 -0.7359 2.123 -0.1987 ...
我可以select一个系列,使用基于站点代码的sel方法。例如:
>>> ds.sel(site='mlo')
但是我如何 select 基于其他坐标(即纬度或经度)的数据?
>>> ds.sel(latitude>50)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'latitude' is not defined
感谢您提供易于重现的示例!
由于 python 的限制,您只能将 .sel(x=y)
与 =
一起使用。使用带有纬度的 .isel
的示例(sel
更难,因为它是 float 类型):
In [7]: ds.isel(latitude=0)
Out[7]:
<xarray.Dataset>
Dimensions: (index: 20, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
latitude float64 71.32
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index) float64 0.6493 -0.9105 -0.9963 -0.6206 0.6856 ...
b (site, index) float64 -0.03405 -1.49 0.2646 -0.3073 0.6326 ...
要使用>
等条件,可以使用.where
:
In [9]: ds.where(ds.latitude>50, drop=True)
Out[9]:
<xarray.Dataset>
Dimensions: (index: 20, latitude: 2, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
* latitude (latitude) float64 71.32 72.58
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index, latitude) float64 0.6493 0.6493 -0.9105 -0.9105 ...
b (site, index, latitude) float64 -0.03405 -0.03405 -1.49 -1.49 ...
通过 "sel" 方法 selecting 数据的另一种解决方案是使用 Python 的 "slice" 对象。
因此,为了 select 来自纬度大于给定值(即北纬 50 度)的 Xarray 对象的数据,可以编写以下内容:
ds.sel(dict(latitude=slice(50,None)))
希望对您有所帮助。
此致,
我正在学习如何使用 python xarray
包,但是,我在处理多维数据时遇到了问题。具体如何添加和使用附加坐标?
这是一个例子。
import xarray as xr
import pandas as pd
import numpy as np
site_id = ['brw','sum','mlo']
dss = []
for site in site_id:
df = pd.DataFrame(np.random.randn(20,2),columns=['a','b'],index=pd.date_range('20160101',periods=20,freq='MS'))
ds = df.to_xarray()
dss.append(ds)
ds = xr.concat(dss, dim=pd.Index(site_id, name='site'))
ds.coords['latitude'] = [71.323, 72.58, 19.5362]
ds.coords['longitude'] = [156.6114, 38.48, 155.5763]
我的 xarray
数据集如下所示:
>>> ds
<xarray.Dataset>
Dimensions: (index: 20, latitude: 3, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
* latitude (latitude) float64 71.32 72.58 19.54
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index) float64 -0.1403 -0.2225 -1.199 -0.8916 0.1149 ...
b (site, index) float64 -1.506 0.9106 -0.7359 2.123 -0.1987 ...
我可以select一个系列,使用基于站点代码的sel方法。例如:
>>> ds.sel(site='mlo')
但是我如何 select 基于其他坐标(即纬度或经度)的数据?
>>> ds.sel(latitude>50)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'latitude' is not defined
感谢您提供易于重现的示例!
由于 python 的限制,您只能将 .sel(x=y)
与 =
一起使用。使用带有纬度的 .isel
的示例(sel
更难,因为它是 float 类型):
In [7]: ds.isel(latitude=0)
Out[7]:
<xarray.Dataset>
Dimensions: (index: 20, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
latitude float64 71.32
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index) float64 0.6493 -0.9105 -0.9963 -0.6206 0.6856 ...
b (site, index) float64 -0.03405 -1.49 0.2646 -0.3073 0.6326 ...
要使用>
等条件,可以使用.where
:
In [9]: ds.where(ds.latitude>50, drop=True)
Out[9]:
<xarray.Dataset>
Dimensions: (index: 20, latitude: 2, longitude: 3, site: 3)
Coordinates:
* index (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ...
* site (site) object 'brw' 'sum' 'mlo'
* latitude (latitude) float64 71.32 72.58
* longitude (longitude) float64 156.6 38.48 155.6
Data variables:
a (site, index, latitude) float64 0.6493 0.6493 -0.9105 -0.9105 ...
b (site, index, latitude) float64 -0.03405 -0.03405 -1.49 -1.49 ...
通过 "sel" 方法 selecting 数据的另一种解决方案是使用 Python 的 "slice" 对象。
因此,为了 select 来自纬度大于给定值(即北纬 50 度)的 Xarray 对象的数据,可以编写以下内容:
ds.sel(dict(latitude=slice(50,None)))
希望对您有所帮助。
此致,