#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. Но опять же, в игру вступает ограничение по времени. Я не могу изменить словарь, как вы упомянули, поскольку я просто пишу программное обеспечение для последующего использования, и я буду получать записи в формате, который я упомянул. Мой план состоял в том, чтобы использовать транспонирование