Назначьте даты заранее определенным периодам с помощью панд

#pandas #dataframe #date

Вопрос:

Скажем, у нас есть 2 df—пожалуйста, используйте pd.read_clipboard() :

df_1

 Date
1995-03-12
1980-11-30
1972-03-05
1978-12-03
 

df_2

 Period  From        To
39      1971-11-29  1975-11-30
40      1975-01-12  1979-11-25
41      1979-11-26  1983-11-27
42      1983-11-28  1987-11-29
43      1987-11-30  1991-11-24
44      1991-11-25  1995-12-03
45      1995-04-12  1999-12-05
 

Также предположим, что все даты указаны в формате datetime64[ns]

Что мне нужно, так это назначить соответствующий Period номер от df_2 каждой даты df_1 .

Желаемый выход для df_1 :

 Date        Period
1995-03-12  44
1980-11-30  41
1972-03-05  39
1978-12-03  40
 

Т. е., Period был добавлен столбец df_1 , содержащий соответствующий номер периода, как определено в df_2 .

Примечание df_2 должно оставаться нетронутым, и с ним не следует сливаться df_1 .

Выше приведен пример. Фактическое df_1 имеет сотни дат, а фактическое df_2 имеет пятьдесят периодов. У обоих также есть еще много колонок.

Спасибо

Ответ №1:

Давайте попробуем IntervalIndex

 df2.index = pd.IntervalIndex.from_arrays(df2.From,df2.To)
df1['Period'] = df2.loc[df1.Date,'Period'].values
df1
Out[16]: 
        Date  Period
0 1995-03-12      44
1 1980-11-30      41
2 1972-03-05      39
3 1978-12-03      40
 

Комментарии:

1. Большое спасибо, БЕНИ. Это отлично работает на примере, однако, когда я применяю это решение к своему фактическому полному набору данных, я получаю следующую ошибку: Length of values (731) does not match length of index (663) . Есть идеи, что может быть причиной этого?

2. Может быть, это связано с тем, что некоторым датам было назначено несколько периодов, что привело к более длинному кадру данных?

3. @johnjohn да , это верно

4. Исправлено сейчас! Еще раз большое спасибо, и ответ принят.