首页 > 解决方案 > 在xarray的重采样环境中计算直方图

问题描述

我有一个关于直方图非常灵活计算的问题。

假设您有 30 个不同的数据集(假设是模型结果),并且您想要比较每个数据集的直方图。数据集可以是 1D(时间)或 2D(x,y) 或 3D(x,y,t)。以下是 1 个月内单个 3D 数据集的示例:

In [2]: a = xarray.open_dataset("ECMWF_ERA-40_subset.nc")
In [3]: a
Out[3]:
<xarray.Dataset>
Dimensions:    (latitude: 73, longitude: 144, time: 62)
Coordinates:
  * longitude  (longitude) float32 0.0 2.5 5.0 7.5 ... 350.0 352.5 355.0 357.5
  * latitude   (latitude) float32 90.0 87.5 85.0 82.5 ... -85.0 -87.5 -90.0
  * time       (time) datetime64[ns] 2002-07-01T12:00:00 ... 2002-07-31T18:00:00
Data variables:
    tcw        (time, latitude, longitude) float32 ...
    tcwv       (time, latitude, longitude) float32 ...
    lsp        (time, latitude, longitude) float32 ...
    cp         (time, latitude, longitude) float32 ...

让我们进一步假设,我的代码专用于处理有关时间聚合和空间聚合的非常灵活的设置。即,我可以控制要计算的直方图的时间聚合:每月、每日、季节性、多年来每月等。为了在时间聚合中具有这种灵活性,我迄今为止使用了xarray.resampleorxarray.grouby方法,可以针对自己的功能进行定制:

In [8]: a.resample({'time': 'W'}).mean(dim="time")
Out[8]:
<xarray.Dataset>
Dimensions:    (latitude: 73, longitude: 144, time: 5)
Coordinates:
  * time       (time) datetime64[ns] 2002-07-07 2002-07-14 ... 2002-08-04
  * longitude  (longitude) float32 0.0 2.5 5.0 7.5 ... 350.0 352.5 355.0 357.5
  * latitude   (latitude) float32 90.0 87.5 85.0 82.5 ... -85.0 -87.5 -90.0
Data variables:
    tcw        (time, latitude, longitude) float32 10.668642 ... 0.2204895
    tcwv       (time, latitude, longitude) float32 10.589867 ... 0.21552403
    lsp        (time, latitude, longitude) float32 0.00013404127 ... 6.614067e-05
    cp         (time, latitude, longitude) float32 0.0 0.0 0.0 ... 0.0 0.0 0.0

我想知道如何灵活地可视化所有数据集和所有时间戳的直方图(在我的情况下x=144,每个大小为 4 个不同y=73的周t~15)。什么是快速的方法?

为什么我要问这个问题?

  1. 一种可能性是打开第一个数据集,删除第一周,计算直方图并绘制它;打开下一个数据集,剪下第一周,计算直方图并绘制它......这已经完成到最后一个数据集,然后所有文件都关闭了。之后,第二周对所有数据集进行分析。对我来说,这似乎很奇怪,因为我不知道如何在不使用 xarray 或 pandas 的重新采样功能的情况下选择第一周。请注意灵活性:它也可以是提取的第一天或第一个月或一天中的每个小时(00UTC、01UTC、02UTC、groupby 方法)。

  2. 第二种可能性是利用重采样功能。这意味着在第一步中对所有数据集执行以下操作:

    a.resample({'time':'W'}).apply(histogram)
    

    但这意味着我必须将直方图的结果存储在 netcdf 文件中。如何做到这一点,这真的更快吗?此外,在第二步中,我仍然需要可视化我预见到有问题的结果,python 或 R 的所有直方图都被修剪以获取整个数据集作为输入,而不仅仅是准备好的直方图数据。

标签: pythonpandashistogrampython-xarray

解决方案


推荐阅读