我有一个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
答案 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
。