python - Complicated datetime merge pandas -


assume have following data

import numpy np import pandas pd import datetime  table = [[datetime.datetime(2015, 1, 1), 1],          [datetime.datetime(2015, 1, 27), 1],          [datetime.datetime(2015, 1, 31), 1],          [datetime.datetime(2015, 2, 1), 1],          [datetime.datetime(2015, 2, 3), 1],          [datetime.datetime(2015, 2, 15), 1],          [datetime.datetime(2015, 2, 28), 1],          [datetime.datetime(2015, 3, 1), 1],          [datetime.datetime(2015, 3, 17), 1],          [datetime.datetime(2015, 3, 28), 1],          [datetime.datetime(2015, 4, 12), 1],          [datetime.datetime(2015, 4, 28), 1]]  df = pd.dataframe(table, columns=['date', 'id'])  table2 = [datetime.datetime(2015, 3, 31),            datetime.datetime(2015, 6, 30),            datetime.datetime(2015, 9, 30)] 

is there way merge table2 onto table such elements of table2 joined on closest smallest or equal element of table, , fill table backwards? needs done groupwise on column id. example, resulting table be

         date  id  new 0  2015-01-01   1  2015-03-31 1  2015-01-27   1  2015-03-31 2  2015-01-31   1  2015-03-31 3  2015-02-01   1  2015-03-31 4  2015-02-03   1  2015-03-31 5  2015-02-15   1  2015-03-31 6  2015-02-28   1  2015-03-31 7  2015-03-01   1  2015-03-31 8  2015-03-17   1  2015-03-31 9  2015-03-28   1  2015-03-31 10 2015-04-12   1  2015-06-30 11 2015-04-28   1  2015-06-30 

thanks, tingis

you use searchsorted:

table2 = pd.to_datetime(table2) idx = table2.searchsorted(df['date'].values) 

this finds indices dates in df['date'] should inserted table2 while maintaining sorted order. note assumes table2 starts out in sorted order.


table2 = pd.to_datetime(table2) idx = table2.searchsorted(df['date'].values) df['new'] = table2[idx] print(df) 

yields

         date  id        new 0  2015-01-01   1 2015-03-31 1  2015-01-27   1 2015-03-31 2  2015-01-31   1 2015-03-31 3  2015-02-01   1 2015-03-31 4  2015-02-03   1 2015-03-31 5  2015-02-15   1 2015-03-31 6  2015-02-28   1 2015-03-31 7  2015-03-01   1 2015-03-31 8  2015-03-17   1 2015-03-31 9  2015-03-28   1 2015-03-31 10 2015-04-12   1 2015-06-30 11 2015-04-28   1 2015-06-30 

Comments