Панды Использование столбца Datetime в Dataframe для сопоставления ближайшего совпадения с несколькими столбцами Datetime - PullRequest
0 голосов
/ 22 сентября 2019

Использование столбца Datetime в кадре данных для сопоставления ближайшего совпадения с несколькими столбцами Datetime

df1 = pd.DataFrame({'Datetime_1' : ['2/4/2015 2:00:00','3/5/2015 3:00:00','4/3/2015 4:00:00'],
                    'Datetime_2' : ['2/3/2015 2:00:00','3/3/2015 3:00:00','4/3/2015 4:10:00'],
                    'Datetime_3' : ['2/4/2015 2:00:10','3/5/2015 3:20:00','4/3/2015 4:10:10']})

    Datetime_1          Datetime_2          Datetime_3         Amount
0   2/4/2015 2:00:00    2/3/2015 2:00:00    2/4/2015 2:00:10    100
1   3/5/2015 3:00:00    3/3/2015 3:00:00    3/5/2015 3:20:00    700
2   4/3/2015 4:00:00    4/3/2015 4:10:00    4/3/2015 4:10:10    1000

df2 = pd.DataFrame({'Datetime_1' : ['2/4/2015 2:00:05','3/5/2015 3:11:00','4/3/2015 4:00:01']})

       Datetime_1       Values
0   2/4/2015 2:00:05    10
1   3/5/2015 3:11:00    70
2   4/3/2015 4:10:01    100

Ожидаемый результат

 Datetime_1              Nearest_Match_df1     Values   Amount    MatchColumn 
 2/4/2015 2:00:05        2/4/2015 2:00:00      10       100       Datetime_1
 3/5/2015 3:11:00        3/5/2015 3:20:00      70       700       Datetime_3
 4/3/2015 4:10:01        4/3/2015 4:10:00      100      1000      Datetime_2

1 Ответ

0 голосов
/ 22 сентября 2019

Вы можете использовать merge_asof после изменения df1, чтобы получить все даты в одном столбце.Для этого вы set_index столбец Сумма, затем stack кадр данных, затем reset_index, rename столбец, чтобы соответствовать ожидаемому результату, и дублирует столбец с датами для выполнения слияния.

df_res = pd.merge_asof( df2,
                        df1.set_index('Amount').stack().reset_index(name='Nearest_Match_df1')
                           .rename(columns={'level_1': 'MatchColumn'})
                           .assign(Datetime_1=lambda x: x.Nearest_Match_df1)
                           .sort_values(by=['Datetime_1']),
                        on = ['Datetime_1'], direction='nearest')

print (df_res)
           Datetime_1  values  Amount MatchColumn   Nearest_Match_df1
0 2015-02-04 02:00:05      10     100  Datetime_1 2015-02-04 02:00:00
1 2015-03-05 03:11:00      70     700  Datetime_3 2015-03-05 03:20:00
2 2015-04-03 04:00:01     100    1000  Datetime_1 2015-04-03 04:00:00

Примечание: все столбцы должны быть Datetime типа

...