我有一个40年的时间序列,格式为stn;yyyymmddhh;rainfall,其中yyyy= year,mm = month,dd= dd=,hh= hour。该系列的分辨率为每小时一次。我通过下面的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发布于 2021-04-30 02:44:52
首先必须将包含日期时间的列转换为datetime类型的Series。您可以通过提供日期时间的格式来进行解析。
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.1https://stackoverflow.com/questions/67318147
复制相似问题