我对Pandas还比较陌生,所以如果我的问题没有正确提出,我深表歉意,我这里有一个数据集,
t HVAC1_S1 HVAC2_S1 ... HVAC4_S1 HVAC5_S1 HVAC6_S1
0 2009-08-18 18:12 711.0 0.0 ... 0.0 0.0 0.0
1 2009-08-18 18:14 705.0 734.0 ... 0.0 725.0 711.0
2 2009-08-18 18:15 0.0 0.0 ... 730.0 0.0 0.0
3 2009-08-18 18:29 0.0 721.0 ... 716.0 718.0 712.0
4 2009-08-18 18:30 705.0 0.0 ... 0.0 0.0 0.0
... ... ... ... ... ... ...
156033 2012-11-09 21:59 714.0 720.0 ... 739.0 0.0 727.0
156034 2012-11-09 22:00 0.0 0.0 ... 0.0 743.0 0.0
156035 2012-11-09 22:14 723.0 729.0 ... 734.0 743.0 732.0
156036 2012-11-09 22:29 718.0 732.0 ... 0.0 739.0 725.0
156037 2012-11-09 22:30 0.0 0.0 ... 739.0 0.0 0.0
因此,如果你注意到时间戳,例如,索引"1",即在2009-08-18 18:14时,共读取了5个读数(其中一个由于…而不可见(。现在实际上总共有6个读数,但最后一个读数是在下一分钟读取的,即在2009年08月18日18:15。嗯,这有点令人困惑,因为这里没有秒。此外,一次读取所有6个读数,然后在15分钟后再次测量。现在,当测量一个值时,通常会在下一分钟测量,因为它在一个新的行中。
我想设置一个1分钟的容差,并将这些行的值(如索引2,4156034156037(合并到其前几行,并从数据帧中删除该行
因此,例如,我想获得我的数据帧作为
t HVAC1_S1 HVAC2_S1 ... HVAC4_S1 HVAC5_S1 HVAC6_S1
0 2009-08-18 18:12 711.0 0.0 ... 0.0 0.0 0.0
1 2009-08-18 18:14 705.0 734.0 ... 730.0 725.0 711.0
2 2009-08-18 18:29 705.0 721.0 ... 716.0 718.0 712.0
... ... ... ... ... ... ...
156033 2012-11-09 21:59 714.0 720.0 ... 739.0 743.0 727.0
156035 2012-11-09 22:14 723.0 729.0 ... 734.0 743.0 732.0
156036 2012-11-09 22:29 718.0 732.0 ... 739.0 739.0 725.0
注意:索引0可以忽略,因为它超出了1分钟的容差。
请提供您宝贵的建议。非常感谢。
您可以使用asof
合并将DataFrame与其自身合并。选择向前的方向,不允许完全匹配(否则同一行将始终与其自身合并(。我们可以指定1分钟的公差。我们需要在合并中引入索引,这样我们就可以删除合并后与其他行合并的行。
合并后,我们将有_x
和_y
列,我们可以删除它们,并沿列轴分组以组合它们。
输入数据:
t HVAC1_S1 HVAC2_S1 HVAC4_S1 HVAC5_S1 HVAC6_S1
0 2009-08-18 18:12:00 711.0 0.0 0.0 0.0 0.0
1 2009-08-18 18:14:00 705.0 734.0 0.0 725.0 711.0
2 2009-08-18 18:15:00 0.0 0.0 730.0 0.0 0.0
3 2009-08-18 18:29:00 0.0 721.0 716.0 718.0 712.0
4 2009-08-18 18:30:00 705.0 0.0 0.0 0.0 0.0
代码:
import pandas as pd
#df['t'] = pd.to_datetime(df['t']) #If not datetime
res = pd.merge_asof(df.reset_index(), df.reset_index(),
on='t',
direction='forward',
allow_exact_matches=False,
tolerance=pd.Timedelta('1min'))
res = res.set_index('t')
res = res[~res.index_x.isin(res.index_y)] #Remove rows that merged with others
res = res.drop(columns=['index_x', 'index_y'])
res = res.groupby(res.columns.str.rsplit('_', n=1).str[0], axis=1).sum()
输出:
HVAC1_S1 HVAC2_S1 HVAC4_S1 HVAC5_S1 HVAC6_S1
t
2009-08-18 18:12:00 711.0 0.0 0.0 0.0 0.0
2009-08-18 18:14:00 705.0 734.0 730.0 725.0 711.0
2009-08-18 18:29:00 705.0 721.0 716.0 718.0 712.0