объединение трех разных временных меток с использованием соответствия продолжительности - PullRequest
0 голосов
/ 11 июля 2019

У меня есть три фрейма данных с разными фреймами и частотами. Я хочу объединить их в один фрейм данных.

Первый кадр данных собирает солнечный свет от солнца, как указано ниже:

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. df2 и df3 происходят каждые пять минут в разное время.
  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 Ответ

1 голос
/ 11 июля 2019

Хороший вопрос, я использую reindex с nearest в качестве метода 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...