Добавить индекс отсутствующих дат со значениями по умолчанию - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть pandas dataframe с индексом, представляющим данные (в месячном формате) и несколькими столбцами с числовыми данными.Мин. Пример ниже:

 dict1 = [{'var0': 45, 'var1': 3, 'var2': 2},
     {'var0': 32, 'var1': 4, 'var2': 4},
     {'var0': 23, 'var1': 5, 'var2': 8},
     {'var0': 22, 'var1': 2, 'var2': 12},]
 df = pd.DataFrame(dict1, index=['2016-08', '2016-09','2016-11','2016-12'])

Однако некоторые месяцы отсутствуют, то есть обратите внимание на то, как индекс переходит с сентября на ноябрь. Я хотел бы заполнить все недостающие месяцы так, чтобы новый кадр данныхсодержит дополнительные строки с указанным месяцем в качестве индекса и нули в соответствующей строке, а именно:

  dict1 = [{'var0': 45, 'var1': 3, 'var2': 2},
     {'var0': 32, 'var1': 4, 'var2': 4},
     {'var0': 23, 'var1': 5, 'var2': 8},
     {'var0':  0, 'var1': 0, 'var2': 0},
     {'var0': 22, 'var1': 2, 'var2': 12},]
  df = pd.DataFrame(dict1, index=['2016-08'', '2016-09', '2016-09','2016-11','2016-12'])

Кто-нибудь может порекомендовать подход?

1 Ответ

0 голосов
/ 28 ноября 2018

Создать DatetimeIndex и использовать DataFrame.asfreq:

df.index = pd.to_datetime(df.index)
df = df.asfreq('MS', fill_value=0)

Или DataFrame.reindex с pandas.date_range:

df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq='MS'), fill_value=0)

print(df)
            var0  var1  var2
2016-08-01    45     3     2
2016-09-01    32     4     4
2016-10-01     0     0     0
2016-11-01    23     5     8
2016-12-01    22     2    12

Решение с month period - создание DatetimeIndex.to_period с pandas.period_range:

df.index = pd.to_datetime(df.index).to_period('M')
df = df.reindex(pd.period_range(df.index.min(), df.index.max(), freq='M'), fill_value=0)
print(df)
         var0  var1  var2
2016-08    45     3     2
2016-09    32     4     4
2016-10     0     0     0
2016-11    23     5     8
2016-12    22     2    12

Последнее при необходимости преобразовать в строкиYY-MM добавить DatetimeIndex.strftime:

df.index = df.index.strftime('%Y-%m')
print(df)
         var0  var1  var2
2016-08    45     3     2
2016-09    32     4     4
2016-10     0     0     0
2016-11    23     5     8
2016-12    22     2    12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...