简体   繁体   中英

Pandas : merge on date and hour from datetime index

I have two data frames like following, data frame A has datetime even with minutes, data frame B only has hour.

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

I like to merge the two on the basis of hour date and hour, so that now in dataframe A should have all the rows filled on the basis of merge on date and hour

I can try to do it via

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

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

and then merge

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

but its a very long process, Is their an efficient way to perform the same operation with the help of pandas time series or date functionality?

Use map if need append only one column from B to A with floor for set minute s and second s if exist to 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

For general solution use 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM