#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.