【问题标题】:Creating a data set using an API with Python使用带有 Python 的 API 创建数据集
【发布时间】:2019-08-22 11:37:46
【问题描述】:

我正在尝试创建一个从 API 检索到的 5 年天气数据集

city=input("enter\n")
ask=input("enter date\n")
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)

它显示 0ne 天的数据。 但我需要从 Api 收集 5 年的数据,所以我使用

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)

我如何从 Api 收集 5 年的数据?

【问题讨论】:

  • 您的问题似乎包括您的 API 密钥。我已对其进行了编辑,但它将保留在历史记录中;如果你删除你的问题,它可以被删除。
  • 在您的第二个 sn-p 中,您将值附加到我确定无效的 URL。相反,如果是 GET 请求,您应该将数据放在查询字符串 (params=) 中;如果是 POST 请求,则将数据放在正文 (data=) 中。
  • 温度、湿度和风速
  • 当我使用 Get 请求时,它会提供一天的数据,我需要 5 年
  • 如果tp参数表示时间段,也许你可以增加它来请求更多数据。

标签: python api dataset


【解决方案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'])

【讨论】:

  • 它可以工作并提供 5 年的数据,但如果我选择有限的列,那么我应该使用什么?
  • 我在集合中编辑了您正在寻找的 4 个值 - 您使用 jsonpath 语法提取它们,并附加到单个列表中。 PS:您已达到 API 调用限制,您可能需要寻找替代方法或数据源,因为 5 年的数据将花费至少 1825 次 API 调用。或者,升级您的 API 帐户
  • 它没有升级。我如何将 5 年的数据保存在 .json 文件中,然后将其转换为 csv??
  • 我复制了输出并使用 .json 保存在文本文件中,它给出 JSONDecodeError 错误:额外数据:第 1 行第 5 行 - 第 3672 行第 1071 列(字符 4 - 19523
  • 如果要保存到 csv,则需要 json 模块:import json; json.dumps(all_data),因为您以字典形式复制输出,而不是 json。或者,我可以建议转换为 pandas 数据框并将其保存为 to_csv
猜你喜欢
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2019-01-20
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多