#python #api #dataset
#python #API #набор данных
Вопрос:
Я пытаюсь создать набор данных о погоде за 5 лет, полученный из API
city=input("entern")
ask=input("enter daten")
date_format = "%Y-%m-%d"
date_time = datetime.strptime(ask, date_format)
print(date_time)
json_data = requests.get(
'http://api.worldweatheronline.com/premium/v1/past-weather.ashx',
params=dict(
key='my key',
q=city,
format='json',
date=ask,
tp='24'
)
).json()
print(json_data)
он показывает данные за 0не дней.
но мне нужно собрать данные за 5 лет из Api, поэтому я использую
channels = ['maxtempC','maxtempF', 'mintempC','mintempF']
channels_list = []
for channel in channels:
JSONContent = requests.get("http://api.worldweatheronline.com/premium/v1/past-weather.ashx" channel).json()
channels_list.append([JSONContent['Type'], JSONContent['Temp'], JSONContent['mintem'],JSONContent['views']])
dataset = pd.DataFrame(channels_list)
dataset.sample(5)
это дает
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Как я собираю данные за 5 лет из Api?
Комментарии:
1. Кажется, ваш вопрос включает ваш ключ API. Я отредактировал его, но он останется в истории; его можно удалить, если вы удалите свой вопрос.
2. Во втором фрагменте вы добавляете значения к URL, который, я уверен, недействителен. Вместо этого у вас должны быть ваши данные в строке запроса (
params=
), если это запрос GET, или в теле (data=
), если это запрос POST.3. Температура, влажность и скорость ветра
4. когда я использую запрос Get, он выдает данные за один день, и мне нужно 5 лет
5. Если
tp
параметр означает период времени, возможно, вы могли бы увеличить его, чтобы запросить больше данных.
Ответ №1:
не зная внутренних компонентов API, я могу предложить выполнять ежедневный вызов на каждый день в течение 5 лет и добавлять ежедневные данные в список:
import datetime
import requests
определение функции, которая будет возвращать генератор (не список) для всех дней между заданными start_date и end_date, которые должны быть введены как объекты datetime:
def daterange(start_date, end_date):
for n in range(int ((end_date - start_date).days)):
yield start_date datetime.timedelta(n)
пример значений:
city="London"
start_date="2019-03-01"
end_date="2019-03-11"
date_format = "%Y-%m-%d"
start_date = datetime.datetime.strptime(start_date, date_format)
end_date = datetime.datetime.strptime(end_date, date_format)
сбор ежедневных данных от start_date до end_date, по одному запросу в день:
all_data = []
maxtempC_list = []
maxtempF_list = []
mintempC_list = []
mintempF_list = []
for each_date in daterange(start_date, end_date):
print(each_date.date())
ask = str(each_date.date())
json_data = requests.get(
'http://api.worldweatheronline.com/premium/v1/past-weather.ashx',
params=dict(
key='YOUR_API_KEY',
q=city,
format='json',
date=ask,
tp='24'
)
).json()
print(json_data)
all_data.append(json_data)
maxtempC_list.append(json_data['data']['weather'][0]['maxtempC'])
maxtempF_list.append(json_data['data']['weather'][0]['maxtempF'])
mintempC_list.append(json_data['data']['weather'][0]['mintempC'])
mintempF_list.append(json_data['data']['weather'][0]['mintempF'])
Комментарии:
1. это работает и дает данные за 5 лет, но если я выберу ограниченный столбец, то что мне следует использовать?
2. я отредактировал в collection 4 значения, которые вы ищете — вы извлекаете их, используя синтаксис jsonpath, и добавляете к отдельным спискам. PS: вы достигли предела вызовов API, возможно, вам захочется поискать альтернативный метод или источник данных, поскольку 5 лет хранения данных обойдутся по крайней мере в 1825 вызовов API. в качестве альтернативы, обновите свою учетную запись API
3. это не обновление. как сохранить данные за 5 лет в файле .json, а затем преобразовать их в csv??
4. я скопировал выходные данные и сохранил в текстовом файле с помощью . json выдает ошибку JSONDecodeError: Дополнительные данные: строка 1, столбец 5 — строка 3672, столбец 1071 (символ 4 — 19523
5. если вы хотите сохранить в csv, вам нужен модуль json:
import json; json.dumps(all_data)
поскольку вы скопировали вывод в форме словаря, а не json. или я мог бы предложить преобразовать в фрейм данных pandas и сохранить его в_csv