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

时间:2019-01-31 02:10:16

标签: 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.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

详细介绍(针对每个纬度和经度):

Date                       KBDI-AWAP 
2017-01-01                 10.5
2017-01-02                 9.2
2017-01-03                 9.8
...                        ...
2017-12-31                 8.2

我想将KBDI-AWAP值重新采样为一个小时的间隔。因此,重新采样的数据集的维度为(纬度:106,经度:193,时间:8760)。同一日期内一个小时内的每个KBDI-AWAP值应与原始数据集中的日期值具有相同的值。

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

Date                       KBDI-AWAP 
2017-01-01T00:00:00        10.5
2017-01-01T01:00:00        10.5
2017-01-01T02:00:00        10.5
...
2017-01-02T00:00:00        9.2
2017-01-02T01:00:00        9.2
2017-01-02T02:00:00        9.2
...
2017-01-03T00:00:00        9.8
2017-01-03T01:00:00        9.8
2017-01-03T02:00:00        9.8         
...                        ...
...                        ...
2017-12-31T21:00:00        8.2
2017-12-31T22:00:00        8.2
2017-12-31T23:00:00        8.2

考虑到我应该在数据集上使用resample函数,因此尝试使用mds_kbdi_hourly = mds_kbdi.resample(time='H'),但这只会输出一个DatasetResample对象,而不是一个新的数据集。

我尝试了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.0000000002017-12-31T23:00:00.000000000的时间戳。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在寻找padffill方法。例如:

mds_kbdi.resample(time='1H').pad()

resample方法始终返回一个Resample对象。仅当您应用对象的一种方法(例如pad)时,重采样对象才有用。

Xarray的文档在此处列出了可用的重采样方法:http://xarray.pydata.org/en/stable/api.html#resample-objects

并提供了一些有关如何使用它们的示例:http://xarray.pydata.org/en/stable/time-series.html#resampling-and-grouped-operations