我有一个关于非常灵活的直方图计算的问题。
假设您有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.resample
或xarray.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
,y=73
,t~15
为4个不同的星期)。什么是最快的方法?
为什么我要问这个问题?
一种可能是打开第一个数据集,切出第一周,计算直方图并绘制;打开下一个数据集,剪裁第一周,计算直方图并将其绘制...完成此操作直到最后一个数据集,然后关闭所有文件。之后,第二周将分析所有数据集。对我来说,这似乎很奇怪,因为我不知道如何选择第一周而不使用xarray或pandas的重采样功能。请注意灵活性:它也可以是提取的第一天或提取的第一个月或一天中的每个小时(00UTC,01UTC,02UTC,groupby方法)。
第二个可能性是利用重采样功能。这意味着第一步要对所有数据集执行以下操作:
a.resample({'time':'W'}).apply(histogram)
但这意味着我必须将直方图的结果存储在netcdf文件中。如何做到这一点,这真的更快吗?此外,在第二步中,我仍然要可视化我认为有问题的结果,对python或R的所有直方图进行修剪,以获取整个数据集作为输入,而不仅仅是准备好的直方图数据。