Вопрос: Использование панд - как эффективно заполнить пропущенные даты нулевыми значениями с ежемесячной (например, индексированной в последний день) частотой относительно минимальных / максимальных значений даты на группу ?
Редактировать не предполагать, что введенные даты соответствуют последнему дню месяца.Чтобы решить эту проблему, добавьте следующую строку к предлагаемым ответам ниже:
df.date = df.date + pd.offsets.MonthEnd(0)
Без этого исправления заполненные значения с freq = 'M' могут привести к NA ...!
Примечание: версия панды 0.24.2
Пример ввода:
data = [{'name': 'A', 'date': '2019-01-01', 'val': 10},
{'name': 'A', 'date': '2019-04-30', 'val': 2},
{'name': 'B', 'date': '2019-02-15', 'val': 6},
{'name': 'B', 'date': '2019-05-01', 'val': 5}]
df = pd.DataFrame(data)
date name val
0 2019-01-01 A 10
1 2019-04-30 A 2
2 2019-02-15 B 6
3 2019-05-01 B 5
Обратите внимание, что даты на входе не обязательно являются первым или последним днем ихсоответствующий месяц.
Пример желаемого вывода
date name val
0 2019-01-31 A 10
1 2019-02-28 A 0
2 2019-03-31 A 0
3 2019-04-30 A 2
4 2019-02-28 B 6
5 2019-03-31 B 0
6 2019-04-30 B 0
7 2019-05-31 B 5
Попытки:
Следующее работает на уровне индекса, но заполняет все с помощью NA:
df['date'] = pd.to_datetime(df['date'])
dg = df.groupby('name').apply(lambda x: x.reindex(pd.date_range(min(x.date), max(x.date), freq='M')))
Также:
Панды, заполняющие недостающие даты и значения в группе
Ответ вышеупомянутой ссылки, по-видимому, будет не относительным для каждой группы, а скорее всего для min / набора данных.максимальные значения даты.