python & api + json

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
081569
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2024, 15:09

hallo,

möchte von dem json anbei jeweils den windspeed von 17:00h,23,05,11 des aktuellen tags abfragen - bekomme es nicht gebacken da es en array ist - ev kann mir jemand helfen, danke!

mit

Code: Alles auswählen

speed =  int(data['data']['0']['windSpeed']*3.6)
geht hier nix - funzt nur bei der standard struktur....

will es aber von diese array auslesen....

Code: Alles auswählen

{
      "lat": 0.0,
      "lon": 0.0,
      "alt": 4,
      "resolution": "HIGH",
      "timeZone": "Europe/Vienna",
      "systemOfUnits": "metric",
      "run": "2024-02-04T00:00:00+00:00",
      "data": [
            {
                  "dateTime": "2024-02-04T17:00:00+00:00",
                  "isDay": false,
                  "temp": 9.1,
                  "dewpoint": 3.9,
                  "pressureMsl": 1024.4,
                  "humidityRelative": 69.9,
                  "windSpeed": 7.8,
                  "windDirection": 269,
                  "windGust": 16.4,
                  "cloudCoverage": 100,
                  "sunHours": 0,
                  "precCurrent": 0,
                  "prec6h": 0,
                  "snowAmount": 0,
                  "snowHeight": 0
            },
            {
                  "dateTime": "2024-02-04T23:00:00+00:00",
                  "isDay": false,
                  "temp": 7.5,
                  "dewpoint": 3.6,
                  "pressureMsl": 1024.3,
                  "humidityRelative": 76.3,
                  "windSpeed": 7.2,
                  "windDirection": 268,
                  "windGust": 16.5,
                  "cloudCoverage": 95,
                  "sunHours": 0,
                  "precCurrent": 5,
                  "prec6h": 5,
                  "snowAmount": 0,
                  "snowHeight": 0
            },
            {
                  "dateTime": "2024-02-05T05:00:00+00:00",
                  "isDay": false,
                  "temp": 5.8,
                  "dewpoint": 3.2,
                  "pressureMsl": 1024.7,
                  "humidityRelative": 82.9,
                  "windSpeed": 6.6,
                  "windDirection": 273,
                  "windGust": 14.6,
                  "cloudCoverage": 100,
                  "sunHours": 0,
                  "precCurrent": 0,
                  "prec6h": 0,
                  "snowAmount": 0,
                  "snowHeight": 0
            },
            {
                  "dateTime": "2024-02-05T11:00:00+00:00",
                  "isDay": true,
                  "temp": 9.1,
                  "dewpoint": 3,
                  "pressureMsl": 1024.6,
                  "humidityRelative": 65.9,
                  "windSpeed": 6.2,
                  "windDirection": 271,
                  "windGust": 15.3,
                  "cloudCoverage": 8,
                  "sunHours": 2.9,
                  "precCurrent": 0,
                  "prec6h": 0,
                  "snowAmount": 0,
                  "snowHeight": 0
            },
            {
Danke!
Gruß
simon
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Du sprichst so viel von Arrays, aber da ist gar keins. Oder meinst du "data"?
Das Erklären eines Problems ist schon wichtig.

Mit welchem Modul konvertierst du die Daten?
Wie ist die Fehlermeldung? Denn die sollte dir schon gute Hinweise darauf geben, was genau da schief läuft.
Wie kommst du darauf, dass man in Python mit der Zeichenkette "0" auf das erste Element einer Liste zugreifen kann (was du ja offensichtlich möchtest)?
081569
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2024, 15:09

sorry -

genau, ich will data.windSpeed + windGust auslesen, was aber nicht funktioniert in diesem json.

Die null kan aus dem JSON Path Finder die ich das file mal geladen hatte um zu sehen wie dort den die quelle aussieht un da kam die 0 mit....

fehlermeldung:
Traceback (most recent call last):
File "/home/pi/test/test.py", line 37, in <module>
bow = int(data['data']['windSpeed']*3.6)
TypeError: list indices must be integers or slices, not str

Code: Alles auswählen

response = requests.get(apiurl, headers=headers)

text = response.text
data = json.loads(text)

bow = {}
speed = {}
bow  =  int(data['data']['windGust']*3.6)
speed =  int(data['data']['windSpeed']*3.6)

print(speed,' km/h',bow, ' km/h')
selbiger code funktioniert aber hier:

Code: Alles auswählen

{
      "lat": 0,
      "lon": 0,
      "systemOfUnits": "metric",
      "data": {
            "isDay": {
                  "dateTime": "2024-02-04T17:15:00+01:00",
                  "name": "isDay",
                  "value": false,
                  "type": "bool",
                  "source": "ANALYSIS"
            },
            "temp": {
                  "dateTime": "2024-02-04T15:30:00+00:00",
                  "name": "temp",
                  "value": 8.1,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "dewpoint": {
                  "dateTime": "2024-02-04T15:30:00+00:00",
                  "name": "dewpoint",
                  "value": 5.2,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "humidityRelative": {
                  "dateTime": "2024-02-04T15:30:00+00:00",
                  "name": "humidityRelative",
                  "value": 82,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "prec1h": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "prec1h",
                  "value": 0,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "pressureMsl": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "pressureMsl",
                  "value": 1024.1,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "snowAmount": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "snowAmount",
                  "value": 0,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "snowHeight": {
                  "dateTime": "2024-02-04T06:00:00+00:00",
                  "name": "snowHeight",
                  "value": 0,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "windSpeed": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "windSpeed",
                  "value": 4.6,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "windDirection": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "windDirection",
                  "value": 273,
                  "type": "float",
                  "source": "ANALYSIS"
            },
            "windGust": {
                  "dateTime": "2024-02-04T15:00:00+00:00",
                  "name": "windGust",
                  "value": 9.1,
                  "type": "float",
                  "source": "ANALYSIS"
            },

danke!
Kyrus86
User
Beiträge: 5
Registriert: Samstag 21. Oktober 2023, 13:04

Hallo 081569,

beim ersten JSON ist "data" eine List, beim zweiten ein Dictionary.

Auf die Elemente einer List "[ ]" muss man über Integer Werte zugreifen, beim Dictionary "{ }" über Keywords.

Du versucht beim ersten JSON mit dem String Keyword '0' auf eine List zuzugreifen

Das sagt auch die Fehlermeldung "TypeError: list indices must be integers or slices, not str.

Also

Code: Alles auswählen

speed =  int(data['data'][0]['windSpeed']*3.6)
statt

Code: Alles auswählen

speed =  int(data['data']['0']['windSpeed']*3.6)
081569
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2024, 15:09

@Kyrus86 100x DANKE - das wars!!!
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

@081569: Daher auch meine Frage, woher du die Information hast, dass du mit einer Zeichenkette auf den Index einer Liste zugreifen kannst. Du hast ja keine meiner Fragen beantwortet. Auch nicht, wie du das JSON konvertierst. Wenn du das in die Python Datenstrukturen wandelst, musst du auch eben diese Datenstrukturen verwenden.

Das Wussen um die Verwendung von Listen und Dictionaries in Python ist fundamentales Wissen um die Programmiersprache zu verstehen. Da solltest du dann noch einmal in die Dokumentation schauen, sonst steht das nächste Problem vor der Tür.
Antworten