我试图在一个阵列中获取多年数据的年度最大降雨量数据。我理解如果我想采用一个单一范围的最大值你将需要使用for循环,我看到我遇到的问题有类似的问题。但是,我需要考虑闰年!
因此,第一年我从1960-1965获得了14616个数据点,不包括1965年,其中包含2个闰年:1960年和1964年。闰年包含2928个数据点,每隔一年包含2920个数据点。
我首先想到的是修改类似问题的解决方案,其中涉及使用for循环如下(只是来自他们的直接复制粘贴):
for i,d in enumerate(data_you_want):
if (i % 600) == 0:
avg_for_day = np.mean(data_you_want[i - 600:i])
daily_averages.append(avg_for_day)
他们参与了他们数据中每600行的平均值。我认为可能有一种方法可以修改它,但我无法找到一种工作方式。如果修改它不起作用,是否有另一种方法可以在没有完全切割文件的情况下将闰年循环。
答案 0 :(得分:1)
虚假数据:
import numpy as np
fake = np.random.randint(2, 30, size = 14616)
使用pandas来处理闰年功能。
使用pandas.date_range()
为您的数据创建时间戳。
import pandas as pd
index = pd.date_range(start = '1960-1-1 00:00:00', end = '1964-12-31 23:59:59' , freq='3H')
然后使用索引的时间戳创建一个DataFrame。
df = pd.DataFrame(data = fake, index = index)
按年份汇总 - 利用DatetimeIndex灵活性。
>>> df['1960'].max()
0 29
dtype: int32
>>> df['1960'].mean()
0 15.501366
dtype: float64
>>>
>>> len(df['1960'])
2928
>>> len(df['1961'])
2920
>>> len(df['1964'])
2928
>>>
我只是从文档的Time Series / Date functionality部分拼凑出来。鉴于大熊猫的能力,这看起来有点幼稚,可能会有所改进。
与resampling一样(使用相同的DataFrame)
>>> df.resample('A').mean()
0
1960-12-31 15.501366
1961-12-31 15.170890
1962-12-31 15.412329
1963-12-31 15.538699
1964-12-31 15.382514
>>> df.resample('A').max()
0
1960-12-31 29
1961-12-31 29
1962-12-31 29
1963-12-31 29
1964-12-31 29
>>>
>>> r = df.resample('A')
>>> r.agg([np.sum, np.mean, np.std])
0
sum mean std
1960-12-31 45388 15.501366 8.211835
1961-12-31 44299 15.170890 8.117072
1962-12-31 45004 15.412329 8.257992
1963-12-31 45373 15.538699 7.986877
1964-12-31 45040 15.382514 8.178057
>>>