2016-08-01 1 views
0

Je voudrais sélectionner toutes les cellules de la grille dans une latitude/longue portée, et pour chaque cellule de la grille, l'exporter comme une date, puis vers un fichier csv (ie df.to_csv). Mon ensemble de données est ci-dessous. Je peux utiliser xr.where(...) pour masquer les cellules de la grille en dehors de mon entrée, mais je ne sais pas comment faire la boucle dans les grilles restantes qui n'ont pas été masquées. Sinon, j'ai essayé d'utiliser les fonctions xr.sel, mais ils ne semblent pas accepter les opérateurs comme ds.sel(gridlat_0>45). xr.sel_points(...) peut également fonctionner, mais je ne peux pas comprendre la syntaxe correcte des indexeurs à utiliser dans mon cas. Merci d'avance pour votre aide.python xarray sélectionner par lat/long et extraire les données de point vers la 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 ... 

Répondre

0

La façon la plus simple de le faire est probablement une boucle à travers tous les points de la grille, avec quelque chose comme ce qui suit:

# (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(...) 

Même avec un 685x485, cela ne devrait prendre que quelques secondes pour parcourir en boucle chaque point. Le pré-filtrage avec ds = ds.where(..., drop=True) (disponible dans la prochaine version de xarray, attendu plus tard cette semaine) avant que la main puisse rendre cela beaucoup plus rapide, mais vous aurez toujours le problème de ne pas être en mesure de représenter la grille sélectionnée sur axes orthogonaux.

Une dernière option, probablement la plus propre, consiste à utiliser stack pour convertir le jeu de données en 2D. Ensuite, vous pouvez utiliser les opérations standard de sélection et GroupBy le long de la nouvelle dimension '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

Merci Stephan pour les suggestions, je vais les essayer dès que je résoudre ce problème segfault: (http://stackoverflow.com/questions/38711915/segmentation-fault-writing-xarray-datset-à-netcdf-or-dataframe) – nicway

+0

La première option a fonctionné en 1.6 minutes en utilisant la suggestion de pré-filtrage dans xarray 0.7.3. – nicway