计算每X行数的最大值,如何考虑闰年?

时间:2017-09-28 01:46:29

标签: python for-loop lines leap-year

我试图在一个阵列中获取多年数据的年度最大降雨量数据。我理解如果我想采用一个单一范围的最大值你将需要使用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行的平均值。我认为可能有一种方法可以修改它,但我无法找到一种工作方式。如果修改它不起作用,是否有另一种方法可以在没有完全切割文件的情况下将闰年循环。

1 个答案:

答案 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
>>>

思考的食物:
Time-aware Rolling vs. Resampling