如何在Pandas中将一行合并到最近的行(基于时间戳)



我对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

相关内容

  • 没有找到相关文章

最新更新