使用时间信息从元组计算值的年均值

Compute annual mean of values from a tuple using time information

我有以下形式的每日降水值和时间信息:

a = [(19500101,3.45),(19500102,1.2).......(19701231,1.4)]

我想使用日期信息来计算它的年均值。这可能是一个简单的解决方案。我试过如下。有什么建议吗?

prcp=numpy.array(precipitation)
time=numpy.array(time)
yearly=numpy.zeros(prcp.shape)

#-----------------Get annual means-----------------
for ii in xrange(len(time)):
    tt=time[ii]
    if ii==0:
        year_old=tt[0:4]
        index_start=ii
    else:
        #----------------new year----------------
        year=tt[0:4]
        if year != year_old:
            year_mean=numpy.mean(prcp[index_start:ii])
            yearly[index_start:ii]=year_mean
            year_old=month
            index_start=ii

    #----------------Get the last year----------------
    if ii==len(time)-1:
        year_mean=numpy.mean(prcp[index_start:])
        yearly[index_start:]=year_mean

您可以尝试 Pandas 进行聚合。

import pandas as pd

a = [(19500101,3.45),(19500102,1.2), (19701231,1.4)]  
df = pd.DataFrame(a) # convert to dataframe                                
df[0] = pd.to_datetime(df[0], format='%Y%m%d') # create a datetime series    

df.groupby(df[0].map(lambda x: x.year)).mean() # groupby year and mean from g roups

          1
0
1950  2.325
1970  1.400

您可以使用下面的代码片段来执行此操作:

首先,根据年份分离数据:

>>> list_of_data = [(19500101,3.45), (19500102,1.2), (19701231,1.4)]
>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> for item in list_of_data:
...     data[str(item[0])[:4]].append(item[1])

现在,使用

计算平均值
>>> for key, value in data.iteritems():
...     print key, sum(value)/len(value)
... 
1950 2.325
1970 1.4

请注意,我正在对数据进行两次运行,如果您可以使用 pandas 库,@John 对 Pandas 的回答可能会更快。

我按照@John-Galt 的建议推荐pandas

如果你想要 python 没有 pandas 的解决方案:

import numpy as np
a = [(19500101,3.45),(19500102,1.2).......(19701231,1.4)]
year=lambda x:int(x[0]/10**4)
years={year(x) for x in a}
annual_avg=dict()
for y in years:
   annual_avg[y]=reduce(np.mean,[x[1] for x in a if year(x)==y])