在xarray的重采样环境中计算直方图

时间:2019-03-16 17:31:00

标签: python pandas histogram python-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.resamplexarray.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=144y=73t~15为4个不同的星期)。什么是最快的方法?

为什么我要问这个问题?

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

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

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

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

0 个答案:

没有答案