Как объединить 2 фрейма данных по дате и времени одного df имеет только даты, а другой индексируется ежечасно

#python #pandas #dataframe #datetime

#python #pandas #фрейм данных #дата и время

Вопрос:

у меня есть два фрейма данных. Один индексируется по датам (ежедневно), содержащим значения, действительные в течение всего дня, а другой индексируется по дате и времени (ежечасно), содержащим значения за каждый час.

DF1

 date                A       B       C       D       F       
2017-07-01 11:00:00 2505.56 2513.38 2495.12 2509.17 287000.32
2017-07-01 12:00:00 2509.17 2512.87 2484.99 2488.43 393142.50
2017-07-01 13:00:00 2488.43 2488.43 2454.40 2454.43 693254.01
2017-07-01 14:00:00 2454.43 2473.93 2450.83 2459.35 712864.80
...
2017-07-02 16:00:00 2463.86 2479.25 2462.17 2476.41 1075573.75
2017-07-02 17:00:00 2476.41 2507.54 2474.23 2496.37 3030780.24
2017-07-02 18:00:00 2496.37 2526.72 2490.00 2490.08 2003965.15
2017-07-02 19:00:00 2490.08 2506.11 2478.43 2492.61 1619701.03
...
  

DF2

 date        G
07-05-2017  56
07-04-2017  52
07-03-2017  56
07-02-2017  53
07-01-2917  56
  

Теперь мне нужно объединить два фрейма данных с присвоением значений on day в DF2 всем 24 часам в DF1.

Результат должен выглядеть примерно так.

DF3

 date                A       B       C       D       F           G
2017-07-01 11:00:00 2505.56 2513.38 2495.12 2509.17 287000.32   56
2017-07-01 12:00:00 2509.17 2512.87 2484.99 2488.43 393142.50   56
2017-07-01 13:00:00 2488.43 2488.43 2454.40 2454.43 693254.01   56
2017-07-01 14:00:00 2454.43 2473.93 2450.83 2459.35 712864.80   56
...
2017-07-02 16:00:00 2463.86 2479.25 2462.17 2476.41 1075573.75  53
2017-07-02 17:00:00 2476.41 2507.54 2474.23 2496.37 3030780.24  53
2017-07-02 18:00:00 2496.37 2526.72 2490.00 2490.08 2003965.15  53
2017-07-02 19:00:00 2490.08 2506.11 2478.43 2492.61 1619701.03  53
  

Спасибо за помощь

Ответ №1:

Используйте merge_asof здесь:

 df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'])
df1.sort_values('date', inplace=True)
df2.sort_values('date', inplace=True)

df = pd.merge_asof(df1, df2, on='date')
print(df)

                 date        A        B        C        D           F   G
0 2017-07-01 11:00:00  2505.56  2513.38  2495.12  2509.17   287000.32  56
1 2017-07-01 12:00:00  2509.17  2512.87  2484.99  2488.43   393142.50  56
2 2017-07-01 13:00:00  2488.43  2488.43  2454.40  2454.43   693254.01  56
3 2017-07-01 14:00:00  2454.43  2473.93  2450.83  2459.35   712864.80  56
4 2017-07-02 16:00:00  2463.86  2479.25  2462.17  2476.41  1075573.75  53
5 2017-07-02 17:00:00  2476.41  2507.54  2474.23  2496.37  3030780.24  53
6 2017-07-02 18:00:00  2496.37  2526.72  2490.00  2490.08  2003965.15  53
7 2017-07-02 19:00:00  2490.08  2506.11  2478.43  2492.61  1619701.03  53
  

Ответ №2:

Предполагая, что столбец date имеет одинаковый формат в обеих таблицах, вы можете получить желаемый результат, выполнив следующий код:

 import pandas as pd
import pandasql as pds
a=pd.read_csv('C:\Users\kemot\Desktop\programy Python\a.txt',sep=' ')
b=a.iloc[:,:6]
c=pd.read_csv('C:\Users\kemot\Desktop\programy Python\b.txt',sep=' ')
d=c.iloc[:,:2]
w=pds.sqldf("""select b.*, G from b join d on b.date=d.date""",locals())
  

Вы можете использовать метод слияния для одного из двух df, но для меня sql проще и понятнее. Pandasql — это модуль, который позволяет выполнять sql-запросы к df.