Python:重复日期的平均值

时间:2016-06-06 16:16:53

标签: python pandas dataframe

我有一个numpy数组,datetime存储在大小为100的数组A中:

>>>A[0]
datetime.datetime(2011, 1, 1, 0, 0)

其他99个元素也是datetime.datetime个对象,但很少重复,例如。

A[55] 
datetime.datetime(2011, 11, 2, 0, 0)

A[56] 
datetime.datetime(2011, 11, 2, 0, 0)

我有另一个与Temperature大小相同的A数组,其值与A行相对应:

Temperature[0] = 55
Temperature[55] = 40
Temperature[56] = 50

我正在尝试从A2获取一个新数组,该数组仅具有A的唯一日期时间,并取相应温度重复的平均值。

所以在这种情况下,我的A2只有1 datetime.datetime(2011, 11, 2, 0, 0),温度为0.5*(40+50) = 45

我正在尝试将pandas pivot table用作:

DayLightSavCure = pd.pivot_table(pd.DataFrame({'DateByHour': A, 'Temp': Temperature}), index=['DateByHour'], values=['Temp'], aggfunc=[np.mean])

但错误是:

ValueError: If using all scalar values, you must pass an index

1 个答案:

答案 0 :(得分:1)

我确实与@someone同意,这可以在不深入熊猫的情况下实现。 itertools对此非常好。为Python 3.5+编写(因为statistics

from itertools import groupby
from operator import itemgetter
from random import randint
import datetime
from statistics import mean

# Generate test data
dates = [datetime.datetime(2005, i % 12 + 1, 5, 5, 5, 5) for i in range(100)]
temperatures = [randint(0, 100) for _ in range(100)]

# Calculate averages

## Group data points by unique dates using `groupby`, `sorted` and `zip`
grouped = groupby(sorted(zip(dates, temperatures)), key=itemgetter(0))

##Calculate mean per unique date
averaged = [(key, mean(temperature[1] for temperature in values)) for key, values in grouped]

print(averaged)  # List of tuples
#[(datetime.datetime(2005, 1, 5, 5, 5, 5), 65.22222222222223), (datetime.datetime(2005, 2, 5, 5, 5, 5), 60.0),.......
print(dict(averaged))  # Nicer as a dict
{datetime.datetime(2005, 3, 5, 5, 5, 5): 48.111111111111114, datetime.datetime(2005, 12, 5, 5, 5, 5): 43.75, ..........

如果在计算结束时必须有两个单独的列表/迭代器,则只需将zip应用于averaged