Слияние двух столбцов с разным временем
Есть два датафрейма, хочу произвести слияние по столбцу с Time первого файла (там часы), со столбцом второго файла Time, где минутки. Получится новый файл, где есть скажем 13 часов дня и у нему идут столбцы с минутками и значения их строк. Пример итоговый внизу, попробовал merge в разных видах сделать, что то не выходит, значит я чего то не знаю.
Date Time Count
20200601 110000 15767
20200601 120000 6649
20200601 130000 1415
20200601 140000 2272
20200601 150000 3092
20200601 160000 723
20200601 170000 2303
20200601 180000 2524
20200601 190000 671
20200601 210000 84572
20200601 220000 225204
20200601 230000 114821
20200602 0 39523
20200602 110000 95909
20200602 120000 233851
20200602 130000 182064
Date Time Cont 2
20200601 100100 475
20200601 100200 319
20200601 100300 400
20200601 100400 437
20200601 100500 308
20200601 100600 327
20200601 100700 256
20200601 100800 211
20200601 100900 8031
20200601 101000 120
20200601 101100 47
20200601 101200 101
20200601 101300 196
20200601 101400 181
20200601 101500 130
20200601 101600 240
20200601 101700 59
20200601 101800 109
20200601 101900 48
Что нужно получить:
Date Time Time 2 Count Count 2
20200601 100000 105600 723 109
20200601 100000 105700 723 97
20200601 100000 105800 723 71
20200601 100000 105900 723 69
20200601 110000 110000 981 30
20200601 110000 110100 981 44
20200601 110000 110200 981 21
20200601 110000 110300 981 44
20200601 110000 110400 981 28
20200601 110000 110500 981 14
Файлы: http://file.sampo.ru/7k64j9/
Ответы (1 шт):
Наверное, знатоки могут сделать ещё проще, а у меня, кажется, много лишних телодвижений, но в общем так:
import pandas as pd
df1 = pd.read_csv('1.csv')
df2 = pd.read_csv('2.csv')
# добавляем в df2 колонку с обрезанным до часа временем
df2['TimeHour'] = df2.Time.div(10000).astype(int).mul(10000)
# аналог FULL JOIN из SQL, Pandas поддерживает различные варианты JOIN
df = pd.merge(df1, df2, how='outer', left_on=['Date','Time'], right_on=['Date','TimeHour'], suffixes=['',' 2'])
# поскольку с обеих сторон есть данные, которым нет соответствия, возникли NA
# и данные стали float из-за NA, чиним это и выбираем нужные колонки
df = df.fillna(0).astype(int)[['Date','Time','Time 2','Count','Cont 2']]
# сортируем что получилось
df = df.sort_values(['Date', 'Time', 'Time 2']).reset_index(drop='True')
# смотрим результат
df
Date Time Time 2 Count Cont 2
0 20200601 0 100100 0 475
1 20200601 0 100200 0 319
2 20200601 0 100300 0 400
3 20200601 0 100400 0 437
4 20200601 0 100500 0 308
... ... ... ... ... ...
2249 20200603 230000 234700 262931 943
2250 20200603 230000 234800 262931 770
2251 20200603 230000 234900 262931 2776
2252 20200603 230000 235000 262931 3372
2253 20200604 0 0 74757 0
2254 rows × 5 columns
Получилось не совсем как в вашем выводе, потому что и в df1 есть дата/время, которым нет соответствия в df2 и наоборот тоже. Там, где нет соответствия, там сейчас стоят нули.