Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python字典按年份求和和和平均值_Python_Arrays_Dictionary_Sum_Average - Fatal编程技术网

python字典按年份求和和和平均值

python字典按年份求和和和平均值,python,arrays,dictionary,sum,average,Python,Arrays,Dictionary,Sum,Average,我想得到每年值[0]的平均值和值[3]的总和。我应该怎么做…如果您正在处理此类数据,我绝对建议使用表表示法 以下是一个例子: import os from datetime import datetime, date import datetime test={datetime.date(1977, 6, 5): [81, 55, 0.0, False], datetime.date(2007, 11, 18): [45, 41, 0.02, True], datetime.date(201

我想得到每年值[0]的平均值和值[3]的总和。我应该怎么做…

如果您正在处理此类数据,我绝对建议使用表表示法

以下是一个例子:

import os
from datetime import datetime, date
import datetime
test={datetime.date(1977, 6, 5): [81, 55, 0.0, False],
 datetime.date(2007, 11, 18): [45, 41, 0.02, True],
 datetime.date(2017, 11, 3): [43, 33, 0.3, True],
 datetime.date(2007, 2, 24): [44, 36, 0.36, True],
 datetime.date(2015, 2, 18): [54, 40, 0.0, False],
 datetime.date(2008, 11, 18): [51, 43, 0.01, True],
 datetime.date(1965, 12, 29): [43, 33, 0.27, True]}

sumtmax=0
year=[]
for k, v in test.items():
    year.append(k.year)
yearset=set(year)
print(yearset)

for i in yearset:
    for k, v in test.items():
        k=k.year
        if k==i:
            print(v[0])

您可以使用python builtin按年份获得值的总和,要获得平均值,只需将总和除以按年份输入的数量即可:

import pandas as pd

df = pd.DataFrame(test).T.astype(float)

df.index = pd.to_datetime(df.index, format='%Y-%m-%d')

avg0 = df.groupby(df.index.year)[0].mean()

Out[60]: 
1965    43.0
1977    81.0
2007    44.5
2008    51.0
2015    54.0
2017    43.0
Name: 0, dtype: float64

sum3 = df.groupby(df.index.year)[3].sum()

sum3
Out[61]: 
1965    1.0
1977    0.0
2007    2.0
2008    1.0
2015    0.0
2017    1.0
Name: 3, dtype: float64

这将以dict的形式提供结果,无需外部库:

import os
from datetime import datetime, date
import datetime


test = {
   datetime.date(1977, 6, 5): [81, 55, 0.0, False],
   datetime.date(2007, 11, 18): [45, 41, 0.02, True],
   datetime.date(2017, 11, 3): [43, 33, 0.3, True],
   datetime.date(2007, 2, 24): [44, 36, 0.36, True],
   datetime.date(2015, 2, 18): [54, 40, 0.0, False],
   datetime.date(2008, 11, 18): [51, 43, 0.01, True],
   datetime.date(1965, 12, 29): [43, 33, 0.27, True]
}

yearset = set([k.year for k in test.keys()])

for i in yearset:
    print(sum([v[0] for k, v in test.items() if k.year == i]) / len(list(filter(lambda x: x.year == i, test.keys()))))
    print(sum([v[3] for k, v in test.items() if k.year == i]))

为什么不
year=set()
概念,所以我只是将默认值更改为
(0,0)
元组作为起点,并向其添加新值以及将计数器增加1。
1.0
部分是针对
2.x
用户的,否则您可以在python
3.x
中使用
1
sum3 = {}

for k, v in test.items():
    sum3[k.year] = sum3.get(k.year, 0) + v[3]

avg0 = {}

for k, v in test.items():
    value = avg0.get(k.year, (0, 0))
    avg0[k.year] = (value[0] + v[0], value[1] + 1.0)

avg0 = {k: v[0]/v[1] for k, v in avg0.items()}

sum3
#{2017: 1, 1965: 1, 2007: 2, 2008: 1, 1977: 0, 2015: 0}
avg0
#{2017: 43.0, 1965: 43.0, 2007: 44.5, 2008: 51.0, 1977: 81.0, 2015: 54.0}