微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新采样时间序列

如何解决重新采样时间序列

我有一个格式为 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。