4

从具有可变时间步长的模拟数据中,我有一个不规则的时间向量作为我的值的索引,它们存储在 pandas.DataFrame 中。

让我们考虑一个简化的测试用例:

import pandas as pd
import datetime
time_vec = [datetime.time(0,0),datetime.time(0,0),datetime.time(0,5),datetime.time(0,7),datetime.time(0,10)]
df = pd.DataFrame([1,2,4,3,6],index = time_vec)

使用 normaldf.mean()函数将得到答案 3.2,这仅在时间向量等距的情况下才成立。

我认为第一个时间步长(零秒长)的正确结果是 3.55,平均值是 1.5,第二个时间步长平均值是 3(五分钟长)等等,这导致:

1.5 * 0 + 3*5 + 3.5 * 2 + 4.5 * 3 = 35.5

这导致平均值为 3.55 (35.5 / (0 + 5 + 2 + 3))。

有没有一种有效的方法可以用熊猫做到这一点?

这最终应该会导致类似

df.resample('15M',how = 'This very Method I am looking for') 

创建具有等距时间向量的平均值。

4

1 回答 1

3

好吧,我想出了如何解决我的问题。我不知道这是否是一个不错的解决方案,但它确实有效。

我通过交换datetime.timeby更改了问题中的原始代码datetime.datetime,否则它将不起作用(没有方法total_seconds()datetime.time-Objects。我还必须导入 numpy 才能使用 numpy.average。

所以现在的代码是:

import datetime
import numpy as np
import pandas as pd
time_vec =     [datetime.datetime(2007,1,1,0,0)
               ,datetime.datetime(2007,1,1,0,0) 
               ,datetime.datetime(2007,1,1,0,5)     
               ,datetime.datetime(2007,1,1,0,7)
               ,datetime.datetime(2007,1,1,0,10)]
df = pd.DataFrame([1,2,4,3,6],index = time_vec)

这个小功能解决了我的问题:

def time_based_weighted_mean(tv_df):
    time_delta = [(x-y).total_seconds() for x,y in zip(df.index[1:],df.index[:-1])]
    weights = [x+y for x,y in zip([0]+ time_delta,time_delta+[0])]
    res = np.average(df[0],weights = weights) 
    return res
print time_based_weighted_mean(df[0])

我首先尝试使用pd.index.diff()来计算 time_delta-Array,但这导致了一个numpy.datetime64系列,我不知道如何将它们转换为浮点数,因为np.average需要浮点数作为权重的输入类型。

我很感谢任何改进代码的建议。

于 2014-10-14T21:01:37.600 回答