【问题标题】:python xarray select by lat/long and extract point data to dataframepython xarray 按纬度/经度选择并将点数据提取到数据框
【发布时间】:2018-10-18 05:17:23
【问题描述】:

我想选择纬度/经度范围内的所有网格单元格,并将每个网格单元格导出为日期框,然后导出到 csv 文件(即df.to_csv)。我的数据集如下。我可以使用xr.where(...) 屏蔽输入之外的网格单元,但不确定如何循环遍历未屏蔽的剩余网格。或者,我尝试使用xr.sel 函数,但它们似乎不接受像ds.sel(gridlat_0>45) 这样的运算符。 xr.sel_points(...) 也可能有效,但我无法弄清楚在我的情况下使用的索引器的正确语法。提前感谢您的帮助。

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

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    最简单的方法可能是遍历每个网格点,如下所示:

    # (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。然后,您可以沿新的'space' 维度使用标准选择和 groupby 操作:

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

    【讨论】:

    • 感谢 Stephan 的建议,我会在解决此段错误问题后立即尝试:(stackoverflow.com/questions/38711915/…)
    • 第一个选项使用 xarray 0.7.3 中的预过滤建议在 1.6 分钟内工作。
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2020-06-15
    • 2016-10-21
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多