Как создать фрейм данных из записей, которые имеют временные метки в качестве индекса?

#python-3.x #numpy #dictionary #datetime #python-datetime

#python-3.x #numpy #словарь #дата-время #python-datetime

Вопрос:

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

Работает нормально:

 pd.DataFrame.from_dict({'1':{'a':1,'b':2,'c':3},'2':{'a':1,'c':4},'3':{'b':6}})
  

вывод:

     1   2   3
a   1   1.0 NaN
b   2   NaN 6.0
c   3   4.0 NaN
  

РАЗРЫВЫ

 o=np.arange(np.datetime64('2017-11-01 00:00:00'),np.datetime64('2017-11-01 00:00:00') np.timedelta64(3,'D'),np.timedelta64(1,'D'))

pd.DataFrame.from_records({o[0]:{'a':1,'b':2,'c':3},o[1]:{'a':1,'c':4},o[2]:{'b':6}})
  

вывод:

 KeyError                                  Traceback (most recent call last)
<ipython-input-627-f9a075f611c0> in <module>
      1 o=np.arange(np.datetime64('2017-11-01 00:00:00'),np.datetime64('2017-11-01 00:00:00') np.timedelta64(3,'D'),np.timedelta64(1,'D'))
      2 
----> 3 pd.DataFrame.from_records({o[0]:{'a':1,'b':2,'c':3},o[1]:{'a':1,'c':4},o[2]:{'b':6}})

~/anaconda3/envs/dfs/lib/python3.6/site-packages/pandas/core/frame.py in from_records(cls, data, index, exclude, columns, coerce_float, nrows)
   1617             if columns is None:
   1618                 columns = arr_columns = ensure_index(sorted(data))
-> 1619                 arrays = [data[k] for k in columns]
   1620             else:
   1621                 arrays = []

~/anaconda3/envs/dfs/lib/python3.6/site-packages/pandas/core/frame.py in <listcomp>(.0)
   1617             if columns is None:
   1618                 columns = arr_columns = ensure_index(sorted(data))
-> 1619                 arrays = [data[k] for k in columns]
   1620             else:
   1621                 arrays = []

KeyError: Timestamp('2017-11-01 00:00:00')
  

Пожалуйста, помогите мне понять поведение и чего мне не хватает. Кроме того, как создать фрейм данных из записей, которые имеют временные метки в качестве индексов

Комментарии:

1. может быть, просто установить индекс, pd.DataFrame.from_dict({'1':{'a':1,'b':2,'c':3},'2':{'a':1,'c':4},'3':{'b':6}}).set_index(o) ?

Ответ №1:

Измените from_records на from_dict (точно так же, как в вашем рабочем примере), и все выполняется нормально.

Еще один необязательный совет: поскольку вы создаете фрейм данных Pandas, используйте собственный способ pandasonic для создания значений datetime для использования в качестве имен столбцов:

 o = pd.date_range(start='2017-11-01', periods=3)
  

Редактировать

Я заметил, что если вы создаете объект o так, как я предложил (как date_range), вы можете использовать даже from_records.

Правка 2

Вы написали, что хотите, чтобы в качестве индекса использовались объекты datetime, тогда как ваш код пытается задать их в качестве имен столбцов.

Если вы хотите, чтобы в качестве индекса использовались объекты datetime, выполните что-то вроде:

 df = pd.DataFrame.from_records({'1':{o[0]:1, o[1]:2, o[2]:3},
    '2':{o[0]:1, o[2]:4}, '3':{o[1]:6}})
  

Результатом является:

             1    2    3
2017-11-01  1  1.0  NaN
2017-11-02  2  NaN  6.0
2017-11-03  3  4.0  NaN
  

Другой способ создать приведенный выше результат -:

 df = pd.DataFrame.from_records([{'1':1, '2':1}, {'1':2, '3':6}, {'1':3, '2':4}], index=o)
  

Комментарии:

1. 1. Время имеет существенное значение для этого упражнения, следовательно, я не буду использовать pandas. Я знаю, что могу создать pandas daterange, а затем использовать его в from_records. Но опять же, в игру вступает ограничение по времени. Я не могу изменить словарь, как вы упомянули, поскольку я просто пишу программное обеспечение для последующего использования, и я буду получать записи в формате, который я упомянул. Мой план состоял в том, чтобы использовать транспонирование