使用持续时间匹配来组合三个不同的时间戳数据帧

时间:2019-07-11 02:08:13

标签: python pandas dataframe

我有三个具有不同数据帧和频率的数据帧。我想将它们合并为一个数据框。

第一个数据框从太阳收集阳光,如下所示:

df1 = 
    index                 light_data
05/01/2019 06:54:00.000  10
05/01/2019 06:55:00.000  20
05/01/2019 06:56:00.000  30
05/01/2019 06:57:00.000  40
05/01/2019 06:59:00.000  50
05/01/2019 07:01:00.000  60
05/01/2019 07:03:00.000  70
05/01/2019 07:04:00.000  80
05/01/2019 07:06:00.000  90

第二个数据帧从A单元收集太阳能

df2 = 
      index                   P1
    05/01/2019 06:54:24.000  100
    05/01/2019 06:59:32.000  200
    05/01/2019 07:04:56.000  300

第三数据框从B单元收集太阳能

df3 = 
       index                  P2
    05/01/2019 06:56:45.000  400
    05/01/2019 07:01:21.000  500
    05/01/2019 07:06:34.000  600

以上三个是来自现场的测量值。三个具有不同的时间戳。现在,我想用一个时间戳将所有三个组合到数据帧中。

  1. df1数据每分钟发生
  2. df2df3每五分钟在不同的时间出现一次。
  3. 结合三个带有df2时间戳的数据帧作为没有秒信息的参考索引。

最后,我希望输出如下所示:

df_combine =     
         combine_index        P1   light_data1    P2   light_data2
        05/01/2019 06:54:00  100     10          400       30
        05/01/2019 06:59:00  200     50          500       60
        05/01/2019 07:04:00  300     80          600       90
   # Note: combine_index is df2 index with no seconds

enter image description here

1 个答案:

答案 0 :(得分:1)

好的问题是我将reindexnearest一起用作方法1

df1['row']=df1.index
s1=df1.reindex(df2.index,method='nearest')
s2=df1.reindex(df3.index,method='nearest')
s1=s1.join(df2).set_index('row')
s2=s2.join(df3).set_index('row')

pd.concat([s1,s2.reindex(s1.index,method='nearest')],1)
Out[67]: 
                     light_data    A  light_data    B
row                                                  
2019-05-01 06:54:00          10  100          40  400
2019-05-01 06:59:00          50  200          60  500
2019-05-01 07:04:00          80  300          90  600

或者在最后一行使用merge_asof

pd.merge_asof(s1,s2,left_index=True,right_index=True,direction='nearest')
Out[81]: 
                     light_data_x    A  light_data_y    B
row                                                      
2019-05-01 06:54:00            10  100            40  400
2019-05-01 06:59:00            50  200            40  400
2019-05-01 07:04:00            80  300            90  600

使其可扩展

df1['row']=df1.index

l=[]
for i,x in enumerate([df2,df3]):
    s1=df1.reindex(x.index,method='nearest')
    if i==0:
        l.append(s1.join(x).set_index('row').add_suffix(x.columns[0].str[-1]))
    else :
        l.append(s1.join(x).set_index('row').reindex(l[0].index,method='nearest').add_suffix(x.columns[0].str[-1]))
pd.concat(l,1)