json "auspacken"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
torsten_156
User
Beiträge: 43
Registriert: Freitag 5. April 2019, 20:10

Hallo,

ich hole mir mittels POST-Request einen Datenstrom, der im json-Format geliefert wird. Das Resultat sieht so aus:

Code: Alles auswählen

{
    "processVariableArchive": [
        {
            "pvId": 3638,
            "archiveType": "1",
            "start": "2022-04-12T22:00:00",
            "resolution": {
                "value": 3600
            },
            "values": [
                {
                    "value": 51.0,
                    "status": "5",
                    "flag": "0",
                    "timestamp": "2022-04-12T23:00:00"
                },
                {
                    "value": 55.0,
                    "status": "5",
                    "flag": "0",
                    "timestamp": "2022-04-13T00:00:00"
                },
Mich interessieren hier jetzt erst einmal nur die Werte in "value" sowie "timestamp". Wie kann ich diese jetzt in ein pandas DF überführen? Ich habe es schon mit

Code: Alles auswählen

data = pd.read_json(req.text)
versucht. Da erhalte ich ein DataFrame mit der Column "processVariableArchive" in der dann alle daten ini einer Zelle stehen.

Grüße
Torsten
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Pandas kann nur einfache Datensturkturen abbilden.
Du mußt die json-Struktur laden und nur die Values an pd.Dataframe übergeben.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@torsten_156: Man kann nicht automagisch beliebig strukturierte/verschachtelte Daten in eine 2-D-Struktur umwandeln. Das einfachste hier wird wohl sein das JSON selbst zu parsen, beziehungsweise falls `req` (was falsch benannt ist BTW) ein `resquests.Response`-Objekt ist, sich direkt davon das geparste JSON geben zu lassen, und dann die Liste mit den Wörterbüchern beim Erstellen eines `DataFrame`-Objekts zu übergeben. Dabei kann man die Spaltennamen angeben die übernommen werden sollen. Und im Schritt danach kann man dann die "timestamp"-Spalte von Zeichenketten in Zeitstempelwerte umwandeln.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Habe auf deiner Grundlage mal valides JSON gemacht:

Code: Alles auswählen

{
    "processVariableArchive": [
        {
            "pvId": 3638,
            "archiveType": "1",
            "start": "2022-04-12T22:00:00",
            "resolution": {
                "value": 3600
            },
            "values": [
                {
                    "value": 51.0,
                    "status": "5",
                    "flag": "0",
                    "timestamp": "2022-04-12T23:00:00"
                },
                {
                    "value": 55.0,
                    "status": "5",
                    "flag": "0",
                    "timestamp": "2022-04-13T00:00:00"
                }
            ]
        }
    ]
}
Dazu eine Funktion zum Bauen eines DataFrames:

Code: Alles auswählen

from operator import itemgetter
import pandas as pd

def get_values(json_data, keys):
    values = json_data["processVariableArchive"][0]["values"]
    data = map(itemgetter(*keys), values)
    return pd.DataFrame(data, columns=keys)
Wenn wir annehmen, dass dein response-Objekt das obenstehende JSON liefert, dann könntest du die Funktion so benutzen:

Code: Alles auswählen

df = get_values(response.json(), ["value", "timestamp"])
print(df)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: den Umweg über itemgetter mußt Du gar nicht gehen.

Code: Alles auswählen

values = json_data["processVariableArchive"][0]["values"]
data = pd.DataFrame(values, columns=["value", "timestamp"])
torsten_156
User
Beiträge: 43
Registriert: Freitag 5. April 2019, 20:10

Danke für eure Antworten. Ich werde mir das parsen von json mal genauer anschauen müssen.

@Sirius3: Vielen Dank für diese Lösung! Sie liefert genau das was ich benötige :-)
Antworten