Заполнение непрерывной pandas данных из разреженной рамки данных

У меня есть имя словаря date_dict, связанное с датами datetime со значениями, соответствующими целым числам наблюдений. Я конвертирую это в редкую серию /dataframe с цензурированными наблюдениями, которые я хотел бы объединить или преобразовать в серию /dataframe с непрерывными датами. Проворное понимание списка - это мой взлом, чтобы обойти тот факт, что pandas, по-видимому, автоматически не будет скрывать объекты даты и времени в соответствующем индексе DateTime.

df1 = pd.DataFrame(data=date_dict.values(),
                   index=[datetime.datetime.combine(i, datetime.time()) 
                          for i in date_dict.keys()],
                   columns=['Name'])
df1 = df1.sort(axis=0)

В этом примере имеется 1258 наблюдений, а индекс DateTime работает с 2003-06-24 по 2012-11-07.

df1.head()
             Name
Date
2003-06-24   2
2003-08-13   1
2003-08-19   2
2003-08-22   1
2003-08-24   5

Я могу создать пустой фреймворк с непрерывным индексом DateTime, но это вводит ненужный столбец и кажется неуклюжим. Мне кажется, что мне не хватает более элегантного решения с участием.

df2 = pd.DataFrame(data=None,columns=['Empty'],
                   index=pd.DateRange(min(date_dict.keys()),
                                      max(date_dict.keys())))
df3 = df1.join(df2,how='right')
df3.head()
            Name    Empty
2003-06-24   2   NaN
2003-06-25  NaN  NaN
2003-06-26  NaN  NaN
2003-06-27  NaN  NaN
2003-06-30  NaN  NaN

Существует ли более простой или более элегантный способ заполнения непрерывного фрейма данных из разреженного блока данных, так что существует (1) непрерывный индекс, (2) NaNs равны 0s и (3) нет остаточного пустого столбец в кадре данных?

            Name
2003-06-24   2
2003-06-25   0
2003-06-26   0
2003-06-27   0
2003-06-30   0

Ответы

Ответ 1

Вы можете просто использовать reindex в временном ряду, используя диапазон дат. Также похоже, что вам лучше использовать TimeSeries вместо DataFrame (см. документация), хотя переиндексирование также является правильным методом для добавления отсутствующих значения индекса в DataFrames.

Например, начиная с:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13),
        pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)])

ts = pd.Series([2,1,2,1,5], index=date_index)

Дает вам временные ряды, например, ваш пример головы DataFrame:

2003-06-24    2
2003-08-13    1
2003-08-19    2
2003-08-22    1
2003-08-24    5

Просто делать

ts.reindex(pd.date_range(min(date_index), max(date_index)))

затем дает вам полный индекс с NaN для ваших отсутствующих значений (вы можете использовать fillna, если хотите заполнить недостающие значения другими значениями - см. здесь):

2003-06-24     2
2003-06-25   NaN
2003-06-26   NaN
2003-06-27   NaN
2003-06-28   NaN
2003-06-29   NaN
2003-06-30   NaN
2003-07-01   NaN
2003-07-02   NaN
2003-07-03   NaN
2003-07-04   NaN
2003-07-05   NaN
2003-07-06   NaN
2003-07-07   NaN
2003-07-08   NaN
2003-07-09   NaN
2003-07-10   NaN
2003-07-11   NaN
2003-07-12   NaN
2003-07-13   NaN
2003-07-14   NaN
2003-07-15   NaN
2003-07-16   NaN
2003-07-17   NaN
2003-07-18   NaN
2003-07-19   NaN
2003-07-20   NaN
2003-07-21   NaN
2003-07-22   NaN
2003-07-23   NaN
2003-07-24   NaN
2003-07-25   NaN
2003-07-26   NaN
2003-07-27   NaN
2003-07-28   NaN
2003-07-29   NaN
2003-07-30   NaN
2003-07-31   NaN
2003-08-01   NaN
2003-08-02   NaN
2003-08-03   NaN
2003-08-04   NaN
2003-08-05   NaN
2003-08-06   NaN
2003-08-07   NaN
2003-08-08   NaN
2003-08-09   NaN
2003-08-10   NaN
2003-08-11   NaN
2003-08-12   NaN
2003-08-13     1
2003-08-14   NaN
2003-08-15   NaN
2003-08-16   NaN
2003-08-17   NaN
2003-08-18   NaN
2003-08-19     2
2003-08-20   NaN
2003-08-21   NaN
2003-08-22     1
2003-08-23   NaN
2003-08-24     5
Freq: D, Length: 62