python - 使用 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 以更有效的方式执行的操作?
解决方案
您应该能够使用 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()
推荐阅读
- java - java中流Collectors.toList()中的不兼容类型
- windows - 使用 BatchFile 将图像从文件复制到剪贴板
- ms-access - 一个表中的两个字段与另一个表相关
- jenkins - 无论如何在静态范围内使用环境变量?
- php - 如何将数据库表中的 SQL 数据回显到
- angular - Angular 7 formGroup 未定义
- javascript - 剪贴板扩展 chrome 没有输入显示
- spring - 未能在“CSSStyleDeclaration”上设置索引属性
- algorithm - 如何用golang获得小数点以下的两个长度?
- django - “无效的密钥错误”recaptcha,我的 views.py 错了吗?