У меня есть двухуровневый словарь, который выглядит так:
myDict = {'a':{'2017-01-01':4.1, '2017-01-02':10.8}, 'b':{'2017-01-01':6.2, '2017-01-03':8.5}}
Я бы хотел сохранить это как фрейм данных, который имеет следующий дизайн:
- Даты, для которых данные существуют в одном столбце, а не в другом столбце, становятся np.nan в кадре данных - это хорошо, потому что тогда я могу использовать функции обратной засыпки, если это необходимо.
- Объединение всех дат становится индексом, и индекс имеет тип pd.DatetimeIndex - это хорошо, так что я могу легко выполнять операции с временем на фрейме данных
Dataframe:
mydf = pd.DataFrame({'a':[4,10,np.nan],'b':[6.2,np.nan,8.5]}, index=pd.DatetimeIndex(['2017-01-04','2017-01-02','2017-01-03']))
mydf.index.name = 'Date'
т. Е.
mydf
Out[33]:
a b
Date
2017-01-04 4.0 6.2
2017-01-02 10.0 NaN
2017-01-03 NaN 8.5
Проблемы, с которыми я сталкиваюсь, заключаются в том, что, конечно, я заранее не знаю, какие даты составляют итоговый индекс (объединение всех дат), и я также не знаю, как лучше всего добавлять данные столбец за столбцом. .
Псевдокод, который я имею в виду:
(1) цикл по всем датам для всех ключей на уровне 1 словаря, затем объединение всех дат. Это становится моим индексом.
(2) Затем создайте новый словарь, который имеет только оригинальные ключи и значения в том же порядке, что и индекс в (1), и np.nan, где никакие значения не могут быть найдены
(3) Используйте словарь в (2) для создания кадра данных для панд
Тем не менее, я вижу некоторые недостатки этого подхода с точки зрения слишком большого количества циклов в словаре и копирования данных чаще, чем это требуется.
Любой совет приветствуется.