Мои данные могут иметь несколько событий на заданную дату или НИКАКИХ событий на дату. Я беру эти события, подсчитываю по дате и рисую их. Однако, когда я их рисую, две мои серии не всегда совпадают.
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
В приведенном выше коде idx становится диапазоном, скажем, 30 дат. 09-01-2013 - 30.09.2013 Однако в S может быть только 25 или 26 дней, потому что для данной даты не произошло никаких событий. Затем я получаю AssertionError, поскольку размеры не совпадают, когда я пытаюсь построить:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
Как правильно с этим справиться? Хочу ли я удалить из IDX даты без значений или (что я бы предпочел) добавить в серию недостающую дату со счетом 0. Я бы предпочел иметь полный график 30 дней с 0 значениями. Если этот подход правильный, есть ли предложения, как начать? Мне нужна какая-то динамическая reindex
функция?
Вот фрагмент S ( df.groupby(['simpleDate']).size()
), нет записей для 04 и 05.
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
reindex
потрясающая функция. Он может (1) переупорядочивать существующие данные для соответствия новому набору меток, (2) вставлять новые строки там, где ранее не существовало меток, (3) заполнять данные для отсутствующих меток (в том числе путем прямого / обратного заполнения) (4) выбирать строки по этикетке!idx = pd.date_range(df.index.min(), df.index.max())
Более быстрое решение - использовать
.asfreq()
. Это не требует создания нового индекса для вызова.reindex()
.источник
date_range
поскольку он неявно использует первый и последний индексы в качестве начала и конца (что вам почти всегда нужно).Одна из проблем заключается в том, что
reindex
при наличии повторяющихся значений произойдет сбой. Допустим, мы работаем с данными с отметками времени, которые мы хотим проиндексировать по дате:доходность
Из-за повторяющейся
2016-11-16
даты попытка переиндексации:не работает с:
(это означает, что в индексе есть дубликаты, а не то, что он сам по себе дубликат)
Вместо этого мы можем использовать
.loc
для поиска записей для всех дат в диапазоне:доходность
fillna
при необходимости можно использовать для ряда столбцов для заполнения пробелов.источник
Blanks
илиNULLS
?df.loc[all_days]
в этом случае работать не будет.Альтернативный подход
resample
, который может обрабатывать повторяющиеся даты в дополнение к отсутствующим датам. Например:resample
- это отложенная операция,groupby
поэтому вам нужно выполнить другую операцию. В этом случаеmean
работает хорошо, но вы также можете использовать многие другие методы панд, такие какmax
,sum
и т. Д.Вот исходные данные, но с дополнительной записью для «2013-09-03»:
И вот результаты:
Я оставил недостающие даты как NaN, чтобы прояснить, как это работает, но вы можете добавить,
fillna(0)
чтобы заменить NaN нулями по запросу OP, или, альтернативно, использовать что-то вродеinterpolate()
заполнения ненулевыми значениями на основе соседних строк.источник
Вот хороший метод для заполнения недостающих дат во фрейме данных, на ваш выбор
fill_value
,days_back
для заполнения и порядка сортировки (date_order
) для сортировки фрейма данных:источник