有一个棘手的问题:
有两个数据帧' 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的功能?或其他什么?
由于
答案 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