使用xarray

时间:2016-11-11 09:27:32

标签: python-2.7 python-xarray

我使用xarray从openDAP服务器读取单点数据,然后将xarray对象转换为dataframe。这很好用。我想在一次通话中阅读多个要点,但我不是最好的方法。

这是我用于单点的代码:

import pandas as pd
import xarray as xr

url = 'http://nomads.ncep.noaa.gov:9090/dods/gfs_0p25/gfs20161111/gfs_0p25_00z'
lats =  [40.1,40.5,42.3]
lons =  [1.02,1.24,1.84]
vars = ['dswrfsfc', 'tmp2m', 'pressfc']

ds = xr.open_dataset(url)

data_single  = ds.sel(lon=lons[0], lat=lats[0], method='nearest')    
ts_dataframe_single = data_single[vars].to_dataframe()

为了读取多个点,我做了:

data  = ds.sel(lon=lons, lat=lats, method='nearest')
ts_dataframe = data[vars].to_dataframe()

这是data.coords

的输出
data.coords
Out[10]: 
Coordinates:
  * time     (time) datetime64[ns] 2016-11-11 2016-11-11T03:00:00 ...
  * lev      (lev) float64 1e+03 975.0 950.0 925.0 900.0 850.0 800.0 750.0 ...
  * lat      (lat) float64 40.0 40.5 42.25
  * lon      (lon) float64 1.0 1.25 1.75

当我转换为数据帧时,结果对象包含时间戳中时间和坐标的混合。这是它的外观:

dataframe containg multiple points

我的问题是:

  • 这是使用xarray检索多个点的最佳方法吗?
  • 如何从结果数据框的单个点提取数据?

提前致谢!

3 个答案:

答案 0 :(得分:3)

我认为你想要sel_points而不是0\1。所以,像这样:

sel

答案 1 :(得分:1)

另一种方法是切片

data = ds.sel(lat=slice(40.1,42.3), lon=slice(1.02,1.84))

但是,你得到的分数比你要求的多。但速度很快。

答案 2 :(得分:1)

您看到的内存问题是,当您只对网格的对角线条目感兴趣时,输出是像素值的纬度x纬度网格,对应于每个纬度,经度坐标对。这在计算上非常昂贵,因为它正在搜索n ^ 2点而不是n点的像素值。

'sel_points()'已过时,因为可以使用sel / isel来实现(请参见下文)。

相反,您可以将lat和lon设置为它们自己的DataArrays:

lats = xr.DataArray(lats, dims='z') #'z' is an arbitrary name placeholder
lons = xr.DataArray(lons, dims='z')
data = ds.sel(lat = lats, lon = lons, method = 'nearest')
#VariableName = 'lev', so you can also do: 
data = ds.lev.sel(lat = lats, lon = lons, method = 'nearest')

请参阅与此相关的post