根据时间间隔加入Pandas数据帧并计算平均值

时间:2018-05-24 13:16:36

标签: python pandas datetime dataframe group-by

有一个棘手的问题:

有两个数据帧' TimeRanges'其中有关时间范围的信息在(开始日期和结束日期与ID)中,如下所示:

ID  StartTime       EndTime
1   01.03.18 12:00  01.03.18 13:00 
2   01.03.18 13:00  01.03.18 13:15 
3   01.03.18 13:30  01.03.18 14:55 

第二个数据框包含时间列,时间值以一分钟的频率增加,列值如下:

Time            Value
01.03.18 12:00  5.00
01.03.18 12:01  20.00
01.03.18 12:02  5.00
01.03.18 13:10  30.00
01.03.18 14:20  45.00

我尝试实现并且不知道如何更接近任务是我想在数据帧TimeRanges中创建新列AvgValue,其中包含那些时间在区间中的值的mean()函数在StartTime和EndTime之间,例如:

ID  StartTime       EndTime         AvgValue
1   01.03.18 12:00  01.03.18 13:00     10
2   01.03.18 13:00  01.03.18 13:15     30
3   01.03.18 13:30  01.03.18 14:55     45

*值10因为它在从01.03.18 12:00到01.03.18 13:00(01.03.18 12:00,01.03.18 12:01,01.03.18 12)的区间内: 02)因此我们只计算这些值的平均值。

这样做的方法是什么? lambdas的功能?或其他什么?

由于

1 个答案:

答案 0 :(得分:1)

我用resample实现了这一点,但它也需要一些摆弄,所以它可能不是最好的解决方案。首先,我们需要将索引设置为DatetimeIndex,TimedeltaIndex或PeriodIndex。

# set Time to be index
df.set_index('Time', inplace=True)
# change index type to datetime
df.index = pd.to_datetime(df.index)

使用resample - 我使用了60分钟的规则。您可以查看以下链接resample

中的规则
new_df = df.resample('60T').mean().reset_index()

现在我们有一个new_df,平均每60分钟一次。我们只需要按照您想要的格式进行以下操作。

from datetime import timedelta    
new_df['EndTime'] = new_df['Time'] + timedelta(seconds=3600)

最后重命名列:

new_df.rename(columns={'Time': 'StartTime', 'Value': 'AvgValue'}, inplace=True)

输出:

    StartTime             AvgValue    EndTime
0   2018-01-03 12:00:00   10.0        2018-01-03 13:00:00
1   2018-01-03 13:00:00   30.0        2018-01-03 14:00:00
2   2018-01-03 14:00:00   45.0        2018-01-03 15:00:00
  
    

编辑:这次使用第一个数据帧(df1)作为时间范围,您可以执行以下操作

  
df1['AvgTime'] = df1.T.apply(lambda x: df.loc[x['StartTime']:x['EndTime']].mean()).T