首页 > 解决方案 > 使用 xarray 聚合点

问题描述

我有一组 netcdf 数据集,它们基本上看起来像一个 CSV 文件,其中包含纬度、经度和值的列。这些是沿着轨道的点,我想通过例如计算落在范围内的所有点的平均值和/或标准偏差,将它们聚合到从 -90 到 90 和 -180 到 180 度的(比如说)1 度的规则网格中给定的单元格。

这很容易通过循环完成

D = np.zeros((180, 360))
for ilat in np.arange(-90, 90, 1, dtype=np.int):
    for ilon in np.arange(-180, 180, 1, dtype=np.int):
        p1 = np.logical_and(ds.lat >= ilat,
                        ds.lat <= ilat + 1)
        p2 = np.logical_and(ds.lon >=ilon,
                        ds.lon <= ilon+1)
        if np.sum(p1*p2) == 0:
            D[90 + ilat, 180 +ilon] = np.nan
        else:
            D[90 + ilat, 180 + ilon] = np.mean(ds.var.values[p1*p2])
            #   D[90 + ilat, 180 + ilon] = np.std(ds.var.values[p1*p2])

除了使用 numba/cython 来加快速度之外,我想知道这是否是您可以直接使用 xarray 以更有效的方式执行的操作?

标签: pythonnumpynetcdfpython-xarray

解决方案


您应该能够使用 pandas 和 xarray 来解决这个问题。

您首先需要将数据集转换为 pandas 数据框。

完成此操作后,df 是数据帧,假设经度和纬度是 lon/lat,您需要将 lon/lats 舍入到最接近的整数值,然后计算每个 lon/lat 的平均值。然后,您需要将 lon/lat 设置为索引。然后可以使用 xarray 的 to_xarray 转换为数组:

import xarray as xr
import pandas as pd
import numpy as np
df = df.assign(lon = lambda x: np.round(x.lon))
df = df.assign(lat = lambda x: np.round(x.lat))
df = df.groupby(["lat", "lon"]).mean()

df = df.set_index(["lat", "lon"])
df.to_xarray()

推荐阅读