如果数据以固定的频率采样(你的文章似乎已经指出了),那么pandas当然可以帮助你。在
一个可能的pandas解决方案是创建一个Panel对象,其中{}(就像字典中的键)属于{}类。Panel的major_axis和{}元素将成为numpy数组中的行和列。这听起来有点奇怪,所以我来举个简单的例子。在>>> import pandas as pd
>>> import numpy as np
>>> start_date = '4/14/2013' # Start today (default time is midnight)
# create the date_range we will use as panel items
>>> ind = pd.date_range(start=start_date, periods=20, freq='6H')
# Create data: thanks @mtadd
>>> values = {h:np.array([np.random.random_integers(1,10,5) for _ in 'x'*2])
for h in np.r_[0:120:6]}
# Create the Panel object directly from the dict of 2D np.arrays
>>> my_panel = pd.Panel(values)
# Set the Panel's items to be the date_range we made earlier
>>> my_panel.items = ind
>>> my_panel.ix[0] # Show first 2D array of data
0 1 2 3 4
0 4 3 10 6 6
1 4 10 7 10 6
>>> values[0] # Same as above, but from the dict
array([[ 4, 3, 10, 6, 6],
[ 4, 10, 7, 10, 6]])
现在我们已经设置好了,我们将使用Panel方法resample。我们将提供两个参数,第一个参数是我们希望数据位于的新频率,第二个参数是我们将指定为mean的关键字参数how。这是我回答的主要部分!
^{pr2}$
注意,我们给resample方法的'24H'参数只是OA发布的示例的扩展。请参阅this link以获取有关此参数可以采用何种类型的描述的详细信息。在
为了验证平均值的计算是否正确,我们将比较averagedPanel中的第一项与我们手工计算的平均值。在>>> averaged.ix[0]
0 1 2 3 4
0 6.5 5.25 7.25 6.25 6.50
1 5.0 6.75 5.25 6.50 5.25
>>> (values[0] + values[6] + values[12] + values[18]) / 4.
array([[ 6.5 , 5.25, 7.25, 6.25, 6.5 ],
[ 5. , 6.75, 5.25, 6.5 , 5.25]])
如果传入一个items对象,items的时间戳可以有更大的灵活性。例如,如果您在元旦下午1:37开始采样,并持续采样50个周期,则可以执行以下操作:>>> from datetime import datetime
>>> start = datetime(2013, 1, 1, 13, 37) # 1:37 on 1/1/2013
>>> ind = pd.date_range(start, periods=50, freq='6H')
那你就会像以前一样继续下去。也可以将开始和结束项传递给date_range,而不是希望它生成的期间数。如果我们从上述同一开始时间到2月28日凌晨4:50,每隔2个半小时收集一次数据,您可以执行以下操作:>>> end = datetime(2013, 2, 28, 4, 50) # 4:50 AM on 2/28/2013
>>> ind = pd.date_range(start, freq='2H 30MIN')
请注意,您不必传递与传入频率完全一致的开始和结束时间。有关如何使用^{}对象或pandas中的time series data的详细信息,请查看这些单词中给出的链接。在