Python 如何在Pandas中将一行合并到最近的行(基于时间戳)?
我对熊猫比较陌生,因此我真诚的道歉如果我的问题没有被恰当地框定,我这里有一个数据集Python 如何在Pandas中将一行合并到最近的行(基于时间戳)?,python,python-3.x,pandas,timestamp,time-series,Python,Python 3.x,Pandas,Timestamp,Time Series,我对熊猫比较陌生,因此我真诚的道歉如果我的问题没有被恰当地框定,我这里有一个数据集 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 ..
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:14,有5个读数(其中一个由于…)而不可见)。现在实际上总共有6次读数,但最后一次读数是在下一分钟,即2009-08-18:15。嗯,这有点混乱,因为这里没有秒。此外,每次读取所有6个读数,15分钟后再次测量。现在,当测量一个值时,通常会在下一分钟测量,因为它位于新行中
我想设置一个1分钟的公差,并将这些行的值(如索引2,4、156034、156037)合并到它以前的行中,然后从数据帧中删除该行
例如,我想获得我的数据帧
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
merge将数据帧与其自身合并。选择前进方向,不允许精确匹配(否则同一行将始终与其自身合并)。我们可以指定1分钟的公差。我们需要在合并中引入索引,以便在合并后删除与其他行合并的行
合并后,我们将有\ux
和\uy
列,我们可以删除这些列并沿列轴分组以合并它们
输入数据:
代码:
输出:
您好,谢谢您的回答,但我得到一个错误“合并错误:键必须是整数、时间戳或浮点”。你能解释一下我错在哪里吗?@MurtazaBasu哦,你一定有串键。在执行此操作之前,请尝试
df['t']=pd.to_datetime(df['t'])
,以便pandas将它们识别为日期。
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