Seite 1 von 1

json "auspacken"

Verfasst: Montag 13. März 2023, 22:02
von torsten_156
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

Re: json "auspacken"

Verfasst: Montag 13. März 2023, 23:56
von Sirius3
Pandas kann nur einfache Datensturkturen abbilden.
Du mußt die json-Struktur laden und nur die Values an pd.Dataframe übergeben.

Re: json "auspacken"

Verfasst: Dienstag 14. März 2023, 00:03
von __blackjack__
@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.

Re: json "auspacken"

Verfasst: Dienstag 14. März 2023, 07:05
von snafu
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)

Re: json "auspacken"

Verfasst: Dienstag 14. März 2023, 08:33
von Sirius3
@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"])

Re: json "auspacken"

Verfasst: Dienstag 14. März 2023, 08:38
von torsten_156
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 :-)