#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. Исправлено сейчас! Еще раз большое спасибо, и ответ принят.