Переиндексируйте pandas DataFrame, чтобы заполнить недостающие даты

У меня есть ежедневные данные в pandas DataFrame df с отсутствующими определенными днями (например, 1980-12-25 ниже). Я хотел бы переиндексировать DataFrame, чтобы добавить эти даты со значениями NaN.

           date  close
None                  
0    1980-12-12  28.75
1    1980-12-15  27.25
2    1980-12-16  25.25
3    1980-12-17  25.87
4    1980-12-18  26.63
5    1980-12-19  28.25
6    1980-12-22  29.63
7    1980-12-23  30.88
8    1980-12-24  32.50
9    1980-12-26  35.50 

Я составил список dates с полным набором дат, которые я хочу.

[Timestamp('1980-12-12 00:00:00'), Timestamp('1980-12-15 00:00:00'), Timestamp('1980-12-16 00:00:00'), Timestamp('1980-12-17 00:00:00'), Timestamp('1980-12-18 00:00:00'), Timestamp('1980-12-19 00:00:00'), Timestamp('1980-12-22 00:00:00'), Timestamp('1980-12-23 00:00:00'), Timestamp('1980-12-24 00:00:00'), Timestamp('1980-12-25 00:00:00'), Timestamp('1980-12-26 00:00:00')]

К сожалению, когда я запускаю команду переиндексации ниже, таблица полностью заполняется NaN.

df.reindex(dates)

Я выполнил следующие проверки, и все они прошли нормально ...

>>> type(df['date'][0])
<class 'pandas._libs.tslib.Timestamp'>

>>> type(dates[0])
<class 'pandas._libs.tslib.Timestamp'>

>>> dates[0] == df['date'][0]
True

person M3RS    schedule 17.07.2017    source источник


Ответы (1)


Из того, что я вижу в вашем вопросе, вам нужно set_index():

df
         date  close
0  1980-12-12  28.75
1  1980-12-15  27.25
2  1980-12-16  25.25
3  1980-12-17  25.87
4  1980-12-18  26.63
5  1980-12-19  28.25
6  1980-12-22  29.63
7  1980-12-23  30.88
8  1980-12-24  32.50
9  1980-12-26  35.50

df['date']  = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df.reindex(dates)

df
            close
date             
1980-12-12  28.75
1980-12-15  27.25
1980-12-16  25.25
1980-12-17  25.87
1980-12-18  26.63
1980-12-19  28.25
1980-12-22  29.63
1980-12-23  30.88
1980-12-24  32.50
1980-12-25    NaN
1980-12-26  35.50

Вам нужно установить index, чтобы он знал, как выровнять ваш новый индекс. Это ваш ожидаемый результат?

person Andrew L    schedule 17.07.2017
comment
Спасибо, Андрей! Именно в этом и заключалась проблема. Не заметил, что столбец даты не был индексом. - person M3RS; 17.07.2017
comment
Отлично, рад помочь. - person Andrew L; 17.07.2017
comment
Я пробовал это точное решение, но получаю ошибку значения, которую я не могу переиндексировать с повторяющейся оси. - person Johnny; 13.09.2020