2016-08-01 4 views
0

Ich möchte alle Gitterzellen innerhalb eines Breiten-/Längenbereichs auswählen und für jede Gitterzelle als Datumsrahmen und dann in eine CSV-Datei exportieren (d df.to_csv). Mein Datensatz ist unten. Ich kann verwenden, um Gitterzellen außerhalb meiner Eingabe auszublenden, aber ich bin mir nicht sicher, wie ich die verbleibenden Gitter, die nicht ausgeblendet wurden, durchlaufen kann. Alternativ habe ich versucht, die xr.sel Funktionen zu verwenden, aber sie scheinen keine Operatoren wie ds.sel(gridlat_0>45) zu akzeptieren. xr.sel_points(...) kann auch funktionieren, aber ich kann nicht die richtige Syntax der Indexer in meinem Fall verwenden. Danke im Voraus für Ihre Hilfe.Python-Xarray Auswahl durch Lat/Long und Extrahieren von Punktdaten in den Datenrahmen

<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 ... 

Antwort

0

Der einfachste Weg, dies zu tun, ist wahrscheinlich durch jeden Gitterpunkt in einer Schleife, mit so etwas wie die folgenden:

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

Selbst mit einem 685x485, sollte dies dauert nur wenige Sekunden, um eine Schleife durch jeder Punkt.

Vorfilterung mit ds = ds.where(..., drop=True) (verfügbar in der nächsten Xarray-Version, fällig später in dieser Woche) vor Hand könnte dies deutlich schneller machen, aber Sie werden immer noch das Problem haben möglicherweise nicht in der Lage, das ausgewählte Raster auf anzuzeigen orthogonalen Achsen.

Eine letzte Option, wahrscheinlich die sauberste, ist die Verwendung stack, um den Datensatz in 2D zu konvertieren. Dann können Sie Standard-Auswahl und groupby Operationen entlang der neuen 'space' Dimension verwenden:

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

Danke Stephan für die Vorschläge, werde ich sie ausprobieren, sobald ich dieses segfault Problem beheben: (http://stackoverflow.com/questions/38711915/segmentation-fault-writing-xarray-datset-zu-netcdf-or-dataframe) – nicway

+0

Die erste Option arbeitete in 1,6 Minuten mit dem Vorfilter Vorschlag in Xarray 0.7.3. – nicway

Verwandte Themen