Загрузка данных об осадках в реальном времени из API Data.gov.sg (json) с помощью Python

1

Я хотел бы загрузить данные о осадках в реальном времени из API Data.gov.sg (в формате json) с Python из метеорологической станции S17 по этой ссылке, но мой код бросает:

TypeError: строковые индексы должны быть целыми числами

Цените, если кто-нибудь может помочь! Спасибо!

Код

#!/usr/bin/env python
import requests
import json
import datetime as dt
from xlwt import Workbook

start_date = dt.datetime(2018, 8, 14, 00, 00, 00)
end_date = dt.datetime(2018, 8, 19, 00, 00, 00)

total_days = (end_date - start_date).days + 1
neadatasum = []
for day_number in range(total_days):
    for day_time in range(0, 24, 86400):
        current_date = (start_date + dt.timedelta(days = day_number)).date()
        current_time = (start_date + dt.timedelta(hours = day_time)).time()
        url = 'https://api.data.gov.sg/v1/environment/rainfall?date_time=' + str(current_date) + 'T' + \
              str(current_time)
        headers = {"api-key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
        data = requests.get(url, headers=headers).json()
        actualtime = str(current_date) + 'T' + str(current_time) + '+08:00'
        print(current_date, current_time)
        if not data['items'][0]:
            station_id = 'S71'
            value = 'Nan'
            neadatasum1 = [current_date, current_time, value]
            neadatasum.append(neadatasum1)
        else:
            datatime = data['items'][0]['timestamp']
            if actualtime != datatime:
                station_id = 'S71'
                value = 'Nan'
                neadatasum1 = [current_date, current_time, value]
                neadatasum.append(neadatasum1)
            else:
                station_id = 'S71'
                value = data['items'][0]['timestamp']['readings']['station_id', 'value']
                neadatasum1 = [current_date, current_time, value]
                neadatasum.append(neadatasum1)
print(neadatasum)

wb = Workbook()
sheet1 = wb.add_sheet('Rainfall 5 minutes(mm)')
sheet1.write(0, 0, 'Date')
sheet1.write(0, 1, 'Time')
sheet1.write(0, 2, 'Rainfall')

for i, j in enumerate(neadatasum):
    for k, l in enumerate(j):
        sheet1.write(i+1, k, l)

wb.save('Rainfall 5 minutes(mm)(14082018 to 19082018).xls')

Traceback (последний последний вызов): Файл "C: /Users/erilpm/AppData/Local/Programs/Python/Python36-32/Rainfall.py", строка 36, в значении = данные ['items'] [0] [ 'timestamp'] ['readingings'] ['station_id', 'value'] TypeError: строковые индексы должны быть целыми числами

  • 1
    Пожалуйста, отформатируйте ваш код и добавьте полный ответ на ваш вопрос.
  • 0
    Я рекомендую вам скрыть ключ API от вашего вопроса
Показать ещё 2 комментария
Теги:

1 ответ

0

Я не уверен на 100%, если я понимаю, что именно вы хотите, чтобы этот код делал, но я даю ему свой лучший снимок. Прошу прокомментировать, если я неправильно понял ваш вопрос!

Хорошо, поэтому, прежде всего, вы не можете индексировать

data['items'][0]['timestamp']['readings']['station_id', 'value']

... если ваши data не выглядят

data[ items , ..., ... ]
        ^
     [ 0, 1, ... ]
       ^
     [..., timestamp, ... ]
             ^
          [readings, ..., ...]
             ^
          [ (station_id, value), (...,...), ..., ... ]

... и действительно, на самом деле это не похоже на то, как выглядят ваши data. На самом деле, если я print(data['items'][0].keys()), все, что я print(data['items'][0].keys()), это ['timestamp','readings'].

Обратите внимание, что когда я печатаю data['items'] я получаю:

[{'timestamp': '2018-08-14T00: 00: 00 + 08: 00', 'readingings': [{'station_id': 'S77', 'value': 0}, {'station_id': 'S109 ',' value ': 0}, {' station_id ':' S117 ',' value ': 0}, {' station_id ':' S55 ',' value ': 0}, {' station_id ':' S64 ',' 'value': 0}, {'station_id': 'S90', 'value': 0} и т.д. и т.д. и т.д.

Хорошо, поэтому я думаю, что вам нужен список таких вещей, как (current time, current date, some value recorded at that specific station). Проблема в том, что вы просматриваете список значений, а не все из них, которые вы хотите... не только одно значение. Итак, вот мое предложение. Замените все в конце цикла следующим:

# ok, so you like station S71, right?
station_id = 'S71'
# use list comprehension to get only values from that station
values = [a['value'] for a in data['items'][0]['readings'] if a['station_id'] == station_id]
# iterate over all the matching values
for value in values:
    # and add them to your nifty list!
    neadatasum1 = [current_date, current_time, value]
    neadatasum.append(neadatasum1)

Я надеюсь это имеет смысл! Если это не работает или не отвечает на ваш вопрос, или если я неправильно понял ваш вопрос, прокомментируйте это, и я (или кто-то более талантливый) попытается исправить это или иначе ответить на все остальное, на что нужно ответить :)

  • 0
    Я просто добавил в код значения = [a ['value'] для данных в данных ['items'] [0] ['readings'], если [[station_id '] == station_id], но возникает больше ошибок. Я думаю, что мой код имеет проблемы, потому что я пытался изменить исходный код, который загружал данные за 1 час с интервалом в 5 минут.
  • 0
    Вы также должны сделать все for value in values: цикл. Скопируйте и вставьте весь блок кода, начиная с station_id . Это не просто строчка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню