Извлечение JSON в pandas dataframe - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я пытаюсь обработать JSON как кадр данных панд. Здесь произошло то, что я получил непрерывный поток структур json. Они просто добавляются. Это целая линия. Я извлек. TXT из него и хочу проанализировать его сейчас с помощью панд.

Пример фрагмента:

{ "positionFlightMessage": { "messageUuid": "95b3b6ca-5dd2-44b4-918a-baa51022d143", "schemaVersion": "1,0-RC1", "метка": 1533134514, "самалёт": "DLH1601",» позиция ": {" маршрутная точка ": {" широта ": 44,14525," долгота ": - 1,31849}," flightLevel ": 340," заголовок ": 24,0}," messageSource ":" ADSB " "flightUniqueId":" AFR1601 -1532928365-авиакомпании-0002" , "airlineIcaoCode": "АСО", "atcCallsign": "AFR89GA", "топливо": {}, "скорость": { "путевая": 442,0}, "высота": { "высота ": 34000,0}," nextPosition ": {" точки маршрута ": {}}," messageSubtype ":" ADSB "}} {" positionFlightMessage ": {" messageUuid ":" 884708c1-2fff-4ebf-b72c-bbc6ed2c3623" ,» schemaVersion ":" 1,0-RC1" , "метка времени": 1533134515, "самалёта": "DLH012", "положение": { "точке маршрута": { "широта": 37.34542, "долгота": 143,79951}, "flightLevel": 320, "заголовок": 54,0}, "messageSource": "ADSB", "flightUniqueId": "EVA12-1532928367-авиалиния-0096", "airlineIcaoCode": "ДЛЙ", "atcCallsign": "EVA012", "топливо" : {}, "скорость": { "путевая": 462,0}, "высота": { "высота": 32000,0}, "nextPosition": { "точки маршрута": {}}, "messageSubtype" : "ADSB"}} ...

как вы видите в этом свете, каждый json начинается с {"positionFlightMessage": и заканчивается messageSubtype":"ADSB"

После того, как json заканчивается, следующий json просто добавляется после него.

Что мне нужно, так это таблица из этого, как это:

95b3b6ca-5dd2-44b4-918a-baa51022d143    1.0-RC1 1533134514  DLH1601 4.414.525   -131.849    340 24.0    ADSB    AFR1601-1532928365-airline-0002 AFR AFR89GA 442.0   34000.0 ADSB
884708c1-2fff-4ebf-b72c-bbc6ed2c3623    1.0-RC1 1533134515  DLH012  3.734.542   14.379.951  320 54.0    ADSB    EVA12-1532928367-airline-0096   DLH EVA012  462.0   32000.0 ADSB

Я пытался использовать pandas read json, но получаю ошибку.

import pandas as pd

df = pd.read_json("tD.txt",orient='columns')

df.head()

ValueError: Конечные данные

tD.txt содержит приведенный выше фрагмент без последних (...) точек

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

messageSubtype":"ADSB"}}

и затем прочитайте его, но, возможно, у вас есть решение, где я могу просто конвертировать большой текстовый файл напрямую и легко преобразовать его в df

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Теперь вот решение для вашего JSON с использованием регулярных выражений.

s = '{"positionFlightMessage":{"messageUuid":"95b3b6ca-5dd2-44b4-918a-baa51022d143","schemaVersion":"1.0-RC1","timestamp":1533134514,"flightNumber":"DLH1601","position":{"waypoint":{"latitude":44.14525,"longitude":-1.31849},"flightLevel":340,"heading":24.0},"messageSource":"ADSB","flightUniqueId":"AFR1601-1532928365-airline-0002","airlineIcaoCode":"AFR","atcCallsign":"AFR89GA","fuel":{},"speed":{"groundSpeed":442.0},"altitude":{"altitude":34000.0},"nextPosition":{"waypoint":{}},"messageSubtype":"ADSB"}}{"positionFlightMessage":{"messageUuid":"884708c1-2fff-4ebf-b72c-bbc6ed2c3623","schemaVersion":"1.0-RC1","timestamp":1533134515,"flightNumber":"DLH012","position":{"waypoint":{"latitude":37.34542,"longitude":143.79951},"flightLevel":320,"heading":54.0},"messageSource":"ADSB","flightUniqueId":"EVA12-1532928367-airline-0096","airlineIcaoCode":"DLH","atcCallsign":"EVA012","fuel":{},"speed":{"groundSpeed":462.0},"altitude":{"altitude":32000.0},"nextPosition":{"waypoint":{}},"messageSubtype":"ADSB"}}'

import re
import json
replaced = json.loads('['+re.sub(r'{\"positionFlightMessage*', ',{\"positionFlightMessage', s)[1:] + ']')

dfTemp = pd.DataFrame(data=replaced)
df = pd.DataFrame()
counter = 0
def newDf(row):
  global df,counter
  counter += 1
  temp = pd.DataFrame([row])
  df = df.append(temp)
dfTemp['positionFlightMessage'] = dfTemp['positionFlightMessage'].apply(newDf)
print(df)
  1. Сначала мы заменяем все вхождения {"positionFlightMessage на ,{"positionFlightMessage и отбрасываем первый разделитель.
  2. Мы создаем из этого фрейм данных, но у нас здесь только один столбец. Используйте функцию apply для столбца и создайте новый фрейм данных из него.
  3. С этого кадра данных вы можете выполнить дополнительную очистку.
0 голосов
/ 09 января 2019

Попробуйте получить поток json для вывода, как показано ниже:

Обратите внимание на начало '[' и окончание ']'. Также обратите внимание на ',' между каждым входом json.

data = [{
    "positionFlightMessage": {
        "messageUuid": "95b3b6ca-5dd2-44b4-918a-baa51022d143",
        "schemaVersion": "1.0-RC1",
        "timestamp": 1533134514,
        "flightNumber": "DLH1601",
        "position": {
            "waypoint": {
                "latitude": 44.14525,
                "longitude": -1.31849
            },
            "flightLevel": 340,
            "heading": 24.0
        },
        "messageSource": "ADSB",
        "flightUniqueId": "AFR1601-1532928365-airline-0002",
        "airlineIcaoCode": "AFR",
        "atcCallsign": "AFR89GA",
        "fuel": {},
        "speed": {
            "groundSpeed": 442.0
        },
        "altitude": {
            "altitude": 34000.0
        },
        "nextPosition": {
            "waypoint": {}
        },
        "messageSubtype": "ADSB"
    }
}, {
    "positionFlightMessage": {
        "messageUuid": "884708c1-2fff-4ebf-b72c-bbc6ed2c3623",
        "schemaVersion": "1.0-RC1",
        "timestamp": 1533134515,
        "flightNumber": "DLH012",
        "position": {
            "waypoint": {
                "latitude": 37.34542,
                "longitude": 143.79951
            },
            "flightLevel": 320,
            "heading": 54.0
        },
        "messageSource": "ADSB",
        "flightUniqueId": "EVA12-1532928367-airline-0096",
        "airlineIcaoCode": "DLH",
        "atcCallsign": "EVA012",
        "fuel": {},
        "speed": {
            "groundSpeed": 462.0
        },
        "altitude": {
            "altitude": 32000.0
        },
        "nextPosition": {
            "waypoint": {}
        },
        "messageSubtype": "ADSB"
    }
}]

Теперь у вас должна быть возможность перебрать каждый элемент 'списка' в json и добавить его к пандам df.

print(len(data))
for i in range(0,len(data)):
    #here is just show messageSource only. Up to you to find out the rest..
    print(data[i]['positionFlightMessage']['messageSource'])
    #instead of printing here you should append it to pandas df.

Надеюсь, это немного вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...