首页 > 解决方案 > 如何使用 python pandas 为 url、api 和日期约束编写一个 for 循环

问题描述

我试图让我的代码工作,但我不能。我想要做的是从一个带有 api 代码的网站获取数据。目标是获取特定日期的信息(在本例中是从 2000 年到 2003 年)

import requests
import json


url ='https://opendata.aemet.es/opendata/api/valores/climatologicos/diarios/datos/' 
start= 'fechaini/2000-01-01T00:00:00UTC/'
end = 'fechafin/2003-01-01T00:00:00UTC/' 
station= 'estacion/1690A/'
api= 'xxxxxxxxx'

complete_url=url+start+end+station+api
print(complete_url)

response = requests.get(complete_url)

data_url = json.loads(response.text)['datos']

data = requests.get(data_url)
data.text
json.loads(data.text)

现在我正在尝试为上面的代码编写一个 for 循环。基本上只是从 2000 年到 2003 年迭代并保存到 csv 文件中。

这是我尝试过的

responses = list()
station = '1690A'


for station in stations:
   rr = requests.get(data_url)
   data=json.loads(rr.text)
   responses.append(data)

但是,我在哪里放置日期约束以及如何将其转换为 csv 文件

谢谢您的帮助

编辑:示例 json

{'fecha': '2000-01-01',
  'indicativo': '1690A',
  'nombre': 'OURENSE',
  'provincia': 'OURENSE',
  'altitud': '143',
  'tmed': '3,2',
  'prec': '0,0',
  'tmin': '-2,4',
  'horatmin': '08:45',
  'tmax': '8,8',
  'horatmax': '16:25',
  'dir': '14',
  'velmedia': '0,6',
  'racha': '3,9',
  'horaracha': '08:18',
  'sol': '4,2',
  'presMax': '1012,7',
  'horaPresMax': '11',
  'presMin': '1009,9',
  'horaPresMin': '15'},
 {'fecha': '2000-01-02',
  'indicativo': '1690A',
  'nombre': 'OURENSE',
  'provincia': 'OURENSE',
  'altitud': '143',
  'tmed': '2,7',
  'prec': '0,0',
  'tmin': '-2,4',
  'horatmin': '08:40',
  'tmax': '7,8',
  'horatmax': '16:30',
  'dir': '14',
  'velmedia': '0,6',
  'racha': '3,6',
  'horaracha': '09:56',
  'sol': '3,7',
  'presMax': '1012,2',
  'horaPresMax': '10',
  'presMin': '1009,7',
  'horaPresMin': 'Varias'},
 {'fecha': '2000-01-03',
  'indicativo': '1690A',
  'nombre': 'OURENSE',
  'provincia': 'OURENSE',
  'altitud': '143',
  'tmed': '4,2',
  'prec': '0,0',
  'tmin': '-1,6',
  'horatmin': '08:20',
  'tmax': '10,0',
  'horatmax': '16:00',
  'dir': '15',
  'velmedia': '0,6',
  'racha': '2,8',
  'horaracha': '07:40',
  'sol': '4,2',
  'presMax': '1011,7',
  'horaPresMax': '11',
  'presMin': '1008,7',
  'horaPresMin': '16'},

标签: pythonpandasloopsfor-loopiteration

解决方案


这应该很容易做到。利用这么熊猫,这是解决方案。

import pandas as pd
from datetime import datetime as dt
def get_csv(jsonData, startingDate, endingDate, csvFilename):
    startingDate = dt.strptime(startingDate, '%Y-%m-%d')
    endingDate = dt.strptime(endingDate, '%Y-%m-%d')
    csvJson = []
    for each in jsonData:
        try: 
            if startingDate <= dt.strptime(each['fecha'], '%Y-%m-%d') <= endingDate: 
                csvJson.append(each) 
        except: 
            pass
    pd.DataFrame(csvJson).to_csv(csvFilename)

调用如下函数

>>> get_csv(jsonData, '2000-01-03', '2001-04-23', 'test.csv')

这会将日期范围 ['2000-01-03' 和 '2001-04-23'] 放入名为“test.csv”的 csv 文件中。

希望这运作良好。


推荐阅读