简体   繁体   中英

Python - Accessing JSON element

I am trying retrieve weather forecasting from DarkSky using their API with the code below. I am interested only in the part of hourly forecasting data:

url="https://api.darksky.net/forecast/api_key/33.972386,-84.231986"
response = requests.get(url)
data = response.json()
data

Here is the part of JSON data I get from data pull:

{'latitude': 33.972386,
 'longitude': -84.231986,
 'timezone': 'America/New_York',
 'currently': {'time': 1553052005,
  'summary': 'Clear',
  'icon': 'clear-night',
  'nearestStormDistance': 23,
  'nearestStormBearing': 169,
  'precipIntensity': 0,
  'precipProbability': 0,
  'temperature': 43.69,
  'apparentTemperature': 43.69,
  'dewPoint': 25.61,
  'humidity': 0.49,
  'pressure': 1026.37,
  'windSpeed': 1.42,
  'windGust': 4.94,
  'windBearing': 79,
  'cloudCover': 0,
  'uvIndex': 0,
  'visibility': 3.86,
  'ozone': 309.99},
 'minutely': {'summary': 'Clear for the hour.',
  'icon': 'clear-night',
  'data': [{'time': 1553052000, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052060, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052120, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052180, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052240, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052300, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052360, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052420, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052480, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052540, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052600, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052660, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052720, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052780, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052840, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052900, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553052960, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053020, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053080, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053140, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053200, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053260, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053320, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053380, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053440, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053500, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053560, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053620, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053680, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053740, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053800, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053860, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053920, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553053980, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054040, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054100, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054160, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054220, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054280, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054340, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054400, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054460, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054520, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054580, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054640, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054700, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054760, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054820, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054880, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553054940, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055000, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055060, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055120, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055180, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055240, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055300, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055360, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055420, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055480, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055540, 'precipIntensity': 0, 'precipProbability': 0},
   {'time': 1553055600, 'precipIntensity': 0, 'precipProbability': 0}]},
 'hourly': {'summary': 'Clear throughout the day.',
  'icon': 'clear-day',
  'data': [{'time': 1553050800,
    'summary': 'Clear',
    'icon': 'clear-night',
    'precipIntensity': 0,
    'precipProbability': 0,
    'temperature': 44.13,
    'apparentTemperature': 44.13,
    'dewPoint': 25.62,
    'humidity': 0.48,
    'pressure': 1026.33,
    'windSpeed': 1.24,
    'windGust': 4.78,
    'windBearing': 93,
    'cloudCover': 0,
    'uvIndex': 0,
    'visibility': 3.49,
    'ozone': 310.66},
   {'time': 1553054400,
    'summary': 'Clear',
    'icon': 'clear-night',
    'precipIntensity': 0,
    'precipProbability': 0,
    'temperature': 42.82,
    'apparentTemperature': 42.82,
    'dewPoint': 25.57,
    'humidity': 0.5,
    'pressure': 1026.44,
    'windSpeed': 1.95,
    'windGust': 5.25,
    'windBearing': 60,
    'cloudCover': 0,
    'uvIndex': 0,
    'visibility': 4.6,
    'ozone': 308.68},
   {'time': 1553058000,
    'summary': 'Clear',
    'icon': 'clear-night',
    'precipIntensity': 0,
    'precipProbability': 0,
    'temperature': 42.45,
    'apparentTemperature': 40.02,
    'dewPoint': 25.52,
    'humidity': 0.51,
    'pressure': 1026.39,
    'windSpeed': 4.15,
    'windGust': 8.98,
    'windBearing': 61,
    'cloudCover': 0,
    'uvIndex': 0,
    'visibility': 10,
    'ozone': 307.84},
   {'time': 1553061600,
    'summary': 'Clear',
    'icon': 'clear-night',
    'precipIntensity': 0,
    'precipProbability': 0,
    'temperature': 41.97,
    'apparentTemperature': 38.42,
    'dewPoint': 25.8,
    'humidity': 0.52,
    'pressure': 1025.98,
    'windSpeed': 5.52,
    'windGust': 11.44,
    'windBearing': 63,
    'cloudCover': 0,
    'uvIndex': 0,
    'visibility': 10,
    'ozone': 307.21},
   {'time': 1553065200,
    'summary': 'Clear',
    'icon': 'clear-night',
    'precipIntensity': 0,
    'precipProbability': 0,
    'temperature': 40.7,
    'apparentTemperature': 36.97,
    'dewPoint': 25.86,
    'humidity': 0.55,
    'pressure': 1025.88,
    'windSpeed': 5.44,
    'windGust': 10.93,
    'windBearing': 61,
    'cloudCover': 0,
    'uvIndex': 0,
    'visibility': 10,
    'ozone': 306.76},

Now this is bit complex json file and I have tried using json_normalize on hourly part of json file:

json_normalize(data['hourly'])

but im getting the the response like this:

        data    icon    summary
0   [{'time': 1553050800, 'summary': 'Clear', 'ico...   clear-day   Clear 
    throughout the day.

Any idea how do I access the temperature and pressure on hourly data part? So i need to get time, temperature, pressure and humidity for every hour available. Thank you

You should be able to access the first element in the hourly data by

data['hourly']['data'][0]['humidity']

So if you iterate over data['hourly']['data'] you should be able to get the data you want.

Eg

for data_point in data['hourly']['data']:
    print data_point['humidity']

You can transform the data so it contains only the values you are interested in:

Code:

import requests
import json

url = 'https://api.darksky.net/forecast/api_key/33.972386,-84.231986'
response = requests.get(url)
data = response.json()
fields = ['time', 'temperature', 'pressure', 'humidity']
transformed = [
    {
        field: rec.get(field)
        for field
        in fields
    }
    for rec
    in data['hourly']['data']
]

print(json.dumps(transformed, indent=4))

Output:

[
    {
        "time": 1553050800,
        "temperature": 44.13,
        "pressure": 1026.33,
        "humidity": 0.48
    },
    {
        "time": 1553054400,
        "temperature": 42.82,
        "pressure": 1026.44,
        "humidity": 0.5
    },
    {
        "time": 1553058000,
        "temperature": 42.45,
        "pressure": 1026.39,
        "humidity": 0.51
    },
    {
        "time": 1553061600,
        "temperature": 41.97,
        "pressure": 1025.98,
        "humidity": 0.52
    },
    {
        "time": 1553065200,
        "temperature": 40.7,
        "pressure": 1025.88,
        "humidity": 0.55
    }
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM