重新采样时间序列

问题描述

我有一个格式为 stn;yyyymmddhh;rainfall 的 40 年时间序列,其中 yyyy= 年,mm = 月,dd= 日,hh= 小时。该系列的分辨率为每小时。我通过以下 groupby 方法提取了每年的最大值:

import pandas as pd
df = pd.read_csv('data.txt',delimiter = ";")
df['yyyy'] = df['yyyymmhhdd'].astype(str).str[:4]
df.groupby(['yyyy'])['rainfall'].max().reset_index()

现在,我试图提取每年 3 小时持续时间的最大值。我尝试了这种滑动最大值方法,但它不起作用。 k 是我感兴趣的持续时间。简单来说,我需要每年多个持续时间(例如 3h、6h 等)的最大降水量总和

class AMS:
    def sliding_max(self,k,data):
        tp = data.values
        period = 24*365
        agg_values = []
        start_j = 1
        end_j = k*int(np.floor(period/k))
        for j in range(start_j,end_j + 1):
            start_i = j - 1
            end_i = j + k + 1
            agg_values.append(np.nansum(tp[start_i:end_i]))
        self.sliding_max = max(agg_values)
        return self.sliding_max

对我的代码有任何建议或改进,或者有什么方法可以用 groupby 实现它。我对python环境有点陌生,所以如果问题没有正确提出,请见谅。

Stn;yyyymmddhh;rainfall 
xyz;1981010100;0.0
xyz;1981010101;0.0
xyz;1981010102;0.0
xyz;1981010103;0.0
xyz;1981010104;0.0
xyz;1981010105;0.0
xyz;1981010106;0.0
xyz;1981010107;0.0
xyz;1981010108;0.0
xyz;1981010109;0.4
xyz;1981010110;0.6
xyz;1981010111;0.1
xyz;1981010112;0.1
xyz;1981010113;0.0
xyz;1981010114;0.1
xyz;1981010115;0.6
xyz;1981010116;0.0
xyz;1981010117;0.0
xyz;1981010118;0.2
xyz;1981010119;0.0
xyz;1981010120;0.0
xyz;1981010121;0.0
xyz;1981010122;0.0
xyz;1981010123;0.0
xyz;1981010200;0.0

解决方法

您首先必须将包含日期时间的列转换为 Series 类型的 datetime。您可以通过提供日期时间的格式来进行解析。

df["yyyymmddhh"] = pd.to_datetime(df["yyyymmddhh"],format="%Y%M%d%H")

获得正确的数据类型后,您必须将该列设置为索引,现在可以使用 pandas 功能处理时间序列数据(在您的情况下重新采样)。
首先,您将数据重新采样到 3 小时窗口并对值求和。从中您重新采样到年度数据,并取每年所有 3 小时窗口的最大值。

df.set_index("yyyymmddhh").resample("3H").sum().resample("Y").max()

# Output
yyyymmddhh  rainfall 
1981-12-31  1.1