Я хотел бы загрузить данные о осадках в реальном времени из 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: строковые индексы должны быть целыми числами
Я не уверен на 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)
Я надеюсь это имеет смысл! Если это не работает или не отвечает на ваш вопрос, или если я неправильно понял ваш вопрос, прокомментируйте это, и я (или кто-то более талантливый) попытается исправить это или иначе ответить на все остальное, на что нужно ответить :)
for value in values:
цикл. Скопируйте и вставьте весь блок кода, начиная с station_id
. Это не просто строчка.