Python xarray-从每天到每小时对时间序列数据重新采样

Python xarray-从每天到每小时对时间序列数据重新采样,python,pandas,numpy,python-xarray,Python,Pandas,Numpy,Python Xarray,我有一个长达一年的数据集(netCDF),以时间、纬度和经度为坐标,以KBDI-AWAP为变量,每天进行采样 使用Python将数据加载到xarray的数据集,并按如下方式打印: print(mds_kbdi) 输出: <xarray.Dataset> Dimensions: (latitude: 106, longitude: 193, time: 365) Coordinates: * latitude (latitude) float32 -39.2 -39.1

我有一个长达一年的数据集(netCDF),以时间、纬度和经度为坐标,以KBDI-AWAP为变量,每天进行采样

使用Python将数据加载到xarray的数据集,并按如下方式打印:

print(mds_kbdi)
输出:

<xarray.Dataset>
Dimensions:    (latitude: 106, longitude: 193, time: 365)
Coordinates:
  * latitude   (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
  * longitude  (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
  * time       (time) datetime64[ns] 2017-01-01 2017-01-02 ... 2017-12-31
Data variables:
    KBDI-AWAP  (time, latitude, longitude) float32 dask.array<shape=(365, 106, 193), chunksize=(31, 106, 193)>
Attributes:
    creationTime:        1525760660
    creationTimeString:  Mon May  7 23:24:20 PDT 2018
    Conventions:         COARDS
我想将KBDI-AWAP值重新采样为一个小时的间隔。因此,重采样数据集的维度为(纬度:106,经度:193,时间:8760)。同一日期内一小时内的每个KBDI-AWAP值应与原始数据集中的日期值具有相同的值

重新采样的数据将为(每个纬度和经度):

考虑到我应该在Dataset上使用
resample
函数,我尝试了
mds\u kbdi\u hourly=mds\u kbdi.resample(time='H')
,但这只输出DatasetResample对象,而不是新的Dataset

我用DatasetResample对象尝试了pad()和ffill()。重新采样的数据似乎丢失了其中任何一个的一些数据。生成的['time']坐标为

['2017-01-01T00:00:00.000000000' 
'2017-01-01T01:00:00.000000000' 
'2017-01-01T02:00:00.000000000' ... 
'2017-12-30T22:00:00.000000000' 
'2017-12-30T23:00:00.000000000' 
'2017-12-31T00:00:00.000000000'].
它缺少从2017-12-31T01:00:00.000000000到2017-12-31T23:00:00.000000000的时间戳。如何解决这个问题

您正在寻找or
ffill
方法。例如:

mds_kbdi.resample(time='1H').pad()
resample
方法始终返回重采样对象。重采样对象仅在应用其方法之一(如pad)时才有用

Xarray的文档在此处列出了可用的重采样方法:


并提供了一些在这里如何使用它们的示例:

谢谢@jhamman。我用DatasetResample对象尝试了pad()和ffill()。重新采样的数据似乎丢失了其中任何一个的一些数据。生成的['time']坐标是
['2017-01-01T00:00:00.000000000''2017-01-01T01:00:00.000000000''2017-01-01T02:00:00.000000000''2017-12-30T22:00:00.000000000''2017-12-30T23:00:00.000000000''2017-12-31T00:00:00.000000000'.
。它缺少从2017-12-31T01:00:00.000000000到2017-12-31T23:00:00.000000000的时间戳。如何解决此问题?您可能需要在填充之前显式地
reindex
。看看
reindex_like
方法。我做了
mds_kbdi_reindexed=mds_kbdi.reindex_like(mds_temp)
,其中mds_temp是另一个数据集,具有我希望重新采样后kbdi数据所具有的坐标。然而,
nan
值被赋予除“T00:00:00”之外的所有时间戳。对,因此在重新索引后需要进行ffill:
mds\u kbdi.reindex\u like(mds\u temp).ffill('time')
。谢谢@jhamman。我想知道使用ffill()和pad()方法有什么区别。
['2017-01-01T00:00:00.000000000' 
'2017-01-01T01:00:00.000000000' 
'2017-01-01T02:00:00.000000000' ... 
'2017-12-30T22:00:00.000000000' 
'2017-12-30T23:00:00.000000000' 
'2017-12-31T00:00:00.000000000'].
mds_kbdi.resample(time='1H').pad()