Панды: объединить дату и час с указателем даты и времени - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть два фрейма данных, например, следующий, фрейм данных A имеет дату и время даже с минутами, фрейм данных B имеет только час.

df:A

dataDate             original    
2018-09-30 11:20:00     3
2018-10-01 12:40:00     10
2018-10-02 07:00:00     5
2018-10-27 12:50:00     5
2018-11-28 19:45:00     7

df:B
dataDate             count    
2018-09-30 10:00:00     300
2018-10-01 12:00:00     50
2018-10-02 07:00:00     120
2018-10-27 12:00:00     234
2018-11-28 19:05:00     714

Мне нравится объединять два на основе даты часа и часа, так что теперь в кадре данных A должны быть все строки заполнены на основе даты и часа слияния

Я могу попытаться сделать это через

 A['date'] = A.dataDate.date
 B['date'] = B.dataDate.date

 A['hour'] = A.dataDate.hour
 B['hour'] = B.dataDate.hour

, а затем объединить

 merge_df = pd.merge(A,B, how='left', left_on=['date', 'hour'], 
           right_on=['date', 'hour'])

, но это очень долгий процесс. Является ли это эффективным способом выполнения той же операции с помощьюВременные ряды панд или функциональность даты?

1 Ответ

0 голосов
/ 04 февраля 2019

Используйте map, если необходимо добавить только один столбец от B до A с floor для набора minute с и second с, если существует 0:

d = dict(zip(B.dataDate.dt.floor('H'), B['count']))
A['count'] = A.dataDate.dt.floor('H').map(d)
print (A)
             dataDate  original  count
0 2018-09-30 11:20:00         3    NaN
1 2018-10-01 12:40:00        10   50.0
2 2018-10-02 07:00:00         5  120.0
3 2018-10-27 12:50:00         5  234.0
4 2018-11-28 19:45:00         7  714.0

Для общего решения используйте DataFrame.join:

A.index = A.dataDate.dt.floor('H')
B.index = B.dataDate.dt.floor('H')

A = A.join(B, lsuffix='_left')
print (A)
                          dataDate_left  original            dataDate  count
dataDate                                                                    
2018-09-30 11:00:00 2018-09-30 11:20:00         3                 NaT    NaN
2018-10-01 12:00:00 2018-10-01 12:40:00        10 2018-10-01 12:00:00   50.0
2018-10-02 07:00:00 2018-10-02 07:00:00         5 2018-10-02 07:00:00  120.0
2018-10-27 12:00:00 2018-10-27 12:50:00         5 2018-10-27 12:00:00  234.0
2018-11-28 19:00:00 2018-11-28 19:45:00         7 2018-11-28 19:05:00  714.0
...