Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pandas中将一行合并到最近的行(基于时间戳)?_Python_Python 3.x_Pandas_Timestamp_Time Series - Fatal编程技术网

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