управление вложенными словарями в python - PullRequest
1 голос
/ 18 июня 2020

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

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

  • Ключ - это sensor_id
  • 'ts' - это метка времени, которую мне нужно преобразовать обратно в DateTime.
  • 'v' - это значение или чтение на соответствующей отметке времени

2220_1: [{'ts': 1577865600000, 'v': 47.5}, {'ts': 1577866500000, 'v': 46}, {'ts': 1577867400000 , 'v': 47}, {'ts': 1577868300000, 'v': 44}]

2221_1: [{'ts': 1577865600000, 'v': 49}, {'ts': 1577866500000, 'v': 47}, {'ts': 1577867400000, 'v': 48}, {'ts': 1577868300000, 'v': 45}]

2222_1: [{'ts' : 1577865600000, 'v': 50}, {'ts': 1577866500000, 'v': 52}, {'ts': 1577867400000, 'v': 51}, {'ts': 1577868300000, 'v': 50,5 }]

Я пытаюсь найти способ преобразования словарей в фрейм данных, который выглядел бы примерно так

"""

     DateTime           2220_1    2221_1    2222_1
     01/01/2017 00:00    47.5       49       50
     01/01/2017 00:15    46         47       52
     01/01/2017 00:30    47         48       51
     01/01/2017 00:45    44         45      50.5

"" "

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вы можете сделать что-то вроде этого:

from datetime import datetime
df = pd.concat([pd.DataFrame(v)
             .set_index('ts')
             .rename(columns={'v':k}) for k,v in d.items()],
          axis=1)

df.index=df.index.map(datetime.fromtimestamp)

Вывод:

                   2220_1  2221_1  2222_1
ts                                   
01/01/2017 00:00    47.5      49    50.0
01/01/2017 00:15    46.0      47    52.0
01/01/2017 00:30    47.0      48    51.0
01/01/2017 00:45    44.0      45    50.5
1 голос
/ 18 июня 2020

@ TrevP дает лучший ответ (пока), но, поскольку я уже написал его, вот чистый python рефакторинг вашего исходного словаря:

d_refactored = {k:{i['ts']:i['v'] for i in v} for k,v in d.items()}
df = pd.DataFrame.from_dict(d_refactored)
df.index /= 1000.
df.index=df.index.map(datetime.fromtimestamp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...