Панды: объединить два кадра данных с разными временными метками. Распространять пропущенные значения - PullRequest
0 голосов
/ 22 мая 2019

У меня есть два кадра данных, которые находятся в одном и том же периоде времени, но с очень разными частотами дискретизации. Я хотел бы еще объединить эти два с двумя простыми правилами.

Выберите значение, которое ближе к меткам времени, а затем все, что пропущено, заполните его. Даты не важны только для меток времени.

Я привожу пример того, как выглядят два кадра данных

[140]:

data.index
[140]:
DatetimeIndex(['2019-02-08 07:53:26.380000', '2019-02-08 07:53:27.334000',
               '2019-02-08 07:53:27.653000', '2019-02-08 07:53:27.654000',
               '2019-02-08 07:53:27.655000', '2019-02-08 07:53:27.973000',
               '2019-02-08 07:53:27.974000', '2019-02-08 07:53:28.293000',
               '2019-02-08 07:53:28.304000', '2019-02-08 07:53:28.611000',
               ...
               '2019-02-08 14:41:03.128000', '2019-02-08 14:41:03.201000',
               '2019-02-08 14:41:03.260000', '2019-02-08 14:41:03.314000',
               '2019-02-08 14:41:03.429000', '2019-02-08 14:41:03.430000',
               '2019-02-08 14:41:03.748000', '2019-02-08 14:41:03.749000',
               '2019-02-08 14:41:03.752000', '2019-02-08 14:41:03.758000'],
              dtype='datetime64[ns]', name='Time', length=457631, freq=None)
[141]:

df.index
[141]:
Index(['07:53:26.380', '07:53:31.319', '07:53:31.825', '07:53:31.888',
       '07:53:31.889', '07:53:31.889', '07:53:31.988', '07:53:32.166',
       '07:53:32.287', '07:53:32.389',
       ...
       '14:40:43.759', '14:40:44.260', '14:40:44.761', '14:40:45.162',
       '14:40:45.662', '14:40:46.163', '14:40:46.664', '14:40:47.064',
       '14:40:47.064', '14:41:03.752'],
      dtype='object', name='Time', length=14641)

данные - это самый большой массив данных, и я хотел бы включить кадр данных df , как я описал: на основе метки времени ближайшего совпадения, а затем распространяться до следующего.

Пока я много искал в Интернете и нашел код, который объединяет.

Например:

merge=pd.merge(data,df, how='inner', left_index=True, right_index=True)

pd.concat([data,df], join='inner', axis=1)

Ни одна из этих работ (они не возвращают пустой фрейм данных), поскольку совпадения времени не совпадают полностью.

Ваша помощь и совет более чем оценены. С уважением Alex

1 Ответ

0 голосов
/ 22 мая 2019

Вы должны использовать метод merge_asof в pandas, после преобразования индекса вашего второго информационного кадра в правильный тип даты и времени (сейчас только время). Пример кода ниже:

import pandas as pd
import numpy as np

#define the bigger dataframe
start = pd.Timestamp('2018-02-08 9:30:00')
end = pd.Timestamp('2018-02-08 15:45:00')
t = np.linspace(start.value, end.value, 100)
t = pd.to_datetime(t)
data=pd.DataFrame(index=t)
data['dummy_value1']=np.arange(len(data))

#define the smaller dataframe
start = pd.Timestamp('2018-02-08 14:30:00')
end = pd.Timestamp('2018-02-08 15:45:00')
t = np.linspace(start.value, end.value, 50)
t = pd.to_datetime(t)
df=pd.DataFrame(index=t)
df['dummy_value2']=10*np.arange(len(df))

#use merge_asof and verify the join has worked as expected by looking at last 10 rows
pd.merge_asof(data,df,left_index=True,right_index=True).tail(10)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...