2016-08-01 1 views
0

Я хотел бы выбрать все ячейки сетки в пределах диапазона lat/long, а для каждой ячейки сетки - экспортировать ее как дату, а затем в файл csv (т. Е. df.to_csv). Мой набор данных ниже. Я могу использовать xr.where(...), чтобы замаскировать ячейки сетки вне моего ввода, но не уверен, как пройти через оставшиеся сетки, которые не были замаскированы. В качестве альтернативы я попытался использовать функции xr.sel, но они, похоже, не принимают таких операторов, как ds.sel(gridlat_0>45). xr.sel_points(...) также может работать, но я не могу понять правильный синтаксис индексаторов для использования в моем случае. Благодарим вас за помощь.python xarray select by lat/long и извлекать данные точки в dataframe

<xarray.Dataset> 
Dimensions: (time: 48, xgrid_0: 685, ygrid_0: 485) 
Coordinates: 
    gridlat_0 (ygrid_0, xgrid_0) float32 44.6896 44.6956 44.7015 44.7075 ... 
    * ygrid_0 (ygrid_0) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 
    * xgrid_0 (xgrid_0) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 
    * time  (time) datetime64[ns] 2016-07-28T01:00:00 2016-07-28T02:00:00 ... 
    gridlon_0 (ygrid_0, xgrid_0) float32 -129.906 -129.879 -129.851 ... 
Data variables: 
    u   (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    gridrot_0 (time, ygrid_0, xgrid_0) float32 nan nan nan nan nan nan nan ... 
    Qli  (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    Qsi  (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    p   (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    rh   (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    press  (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    t   (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 
    vw_dir  (time, ygrid_0, xgrid_0) float64 nan nan nan nan nan nan nan ... 

ответ

0

Самый простой способ сделать это, вероятно, к проходным каждой точки сетки, с чем-то вроде следующего:

# (optionally) create a grid dataset so we don't need to pull out all 
# the data from the main dataset before looking at each point 
grid = ds[['gridlat_0', 'gridlon_0']] 

for i in range(ds.coords['xgrid_0'].size): 
    for j in range(ds.coords['ygrid_0'].size): 
     sub_grid = grid.isel(xgrid_0=i, ygrid_0=j) 
     if is_valid(sub_grid.gridlat_0, sub_grid.gridlon_0): 
      sub_ds = ds.isel(xgrid_0=i, ygrid_0=j) 
      sub_ds.to_dataframe().to_csv(...) 

Даже с 685x485, это займет всего несколько секунд, чтобы перебрать каждый пункт.

Предварительная фильтрация с ds = ds.where(..., drop=True) (доступна в следующем выпуске xarray, который должен выйти позже на этой неделе), прежде чем рука может сделать это значительно быстрее, но у вас все еще будет проблема, возможно, неспособность представить выбранную сетку ортогональные оси.

Окончательный вариант, возможно, самый чистый, заключается в использовании stack для преобразования набора данных в 2D. Затем вы можете использовать стандартные выбора и GroupBy операций по новому 'space' измерения:

ds_stacked = ds.stack(space=['xgrid_0', 'ygrid_0']) 
ds_filtered = ds_stacked.sel(space=(ds_stacked.gridlat_0 > 45)) 
for _, ds_one_place in ds_filtered.groupby('space'): 
    ds_one_place.to_dataframe().to_csv(...) 
+0

Спасибо вам Стефану за предложения, я буду стараться их, как только я могу решить эту проблему Segfault: (http://stackoverflow.com/questions/38711915/segmentation-fault-writing-xarray-datset-to-netcdf-или-dataframe) – nicway

+0

Первый вариант работал за 1,6 минуты с использованием предфильтрационного предложения в xarray 0.7.3. – nicway