Итерация по URL - PullRequest
       5

Итерация по URL

0 голосов
/ 28 апреля 2018

Я пытаюсь очистить данные с веб-сайта, просматривая URL и добавляя собранные данные в список. Я знаю, что это не очень (очень новый), но я доволен всем до итерации:

for date in date_list: # iterate through dates
        weather_list = pd.read_html(base_url + 'KOWD' + '/' + year + '/' + month + '/' + day + end_url)

Я знаю, что в операторе for мне нужно вызывать год, месяц, день, чтобы перебрать их, но я подумал, что, объявив их в кадре данных, они будут распознаны как список. У кого-нибудь есть совет? Не могу пройти это!

import pandas as pd
import csv
from datetime import datetime

base_url = 'https://www.wunderground.com/history/airport/'
end_url = '/DailyHistory.html?req_city=&req_state=&req_statename=&reqdb.zip=&reqdb.magic=&reqdb.wmo='

start_date = '1970, 1, 1'
end_date = '1970, 1, 3'

daterange = pd.date_range(start_date, end_date)

date_list = []
for single_date in daterange: # create list of dates
    date_list.append(single_date.strftime("%Y-%m-%d"))

date_list = pd.DataFrame(date_list, columns = ['date'])

date_list['year'], date_list['month'], date_list['day'] = zip(*date_list['date'].map(lambda x: x.split('-'))) # split date into parts
year = date_list['year']
month = date_list['month']
day = date_list['day']
#print(year)
#print(month)
#print(day)
#print(type(date_list))        
#print(date_list)

for date in date_list: # iterate through dates
    weather_list = pd.read_html(base_url + 'KOWD' + '/' + year + '/' + month + '/' + day + end_url)
    #print(type(weather_list))
    weather_list = weather_list[4] # this is the table of values I want
    weather_list.append(date)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Проще перебирать даты в daterange:

daterange = pd.date_range(start_date, end_date)
url_template = base_url + 'KOWD/{d.year}/{d.month}/{d.day}' + end_url
for date in daterange:
    url = url_template.format(d=date)
    weather_list = pd.read_html(url)
    # etc.

Если это работает для вас, вы можете удалить весь последующий код, который хранит даты в кадре данных, превращает их в строки и создает отдельные столбцы для года, месяца и даты.

Если вам нужно создать таблицу данных дат, вы можете сделать это:

date_list = pd.DataFrame(daterange, columns=['date'])
for k in ['year', 'month', 'day']:
    date_list[k] = date_list.apply(lambda r: getattr(r.date, k), axis=1)

Затем можно выполнить итерацию и выбросить строки.

for index, row in date_list.iterrows():
    url = url_template.format(d=row)
    weather_list = pd.read_html(url)
    # etc.

Затем подумайте, в каком формате вы хотите вывод weather_list. Если скопированная информация не подходит для включения во фрейм данных, тогда может иметь смысл использовать словарь {date: table} пар.

Редактировать: Например, если вы хотите выбрать 3-ю таблицу на каждой странице и объединить ее вместе с датой в одном кадре данных, вы можете сделать это:

weather_dict = {}
for date in daterange:
    table = pd.read_html(url, header=0)[2]
    table.set_index(table.columns.values[0], inplace=True)
    table.index.set_names(None, inplace=True)
    weather_dict[date] = table

weather_df = pd.concat(weather_dict)
0 голосов
/ 29 апреля 2018

Переменные year, month и day имеют тип <class 'pandas.core.series.Series'>. Вам нужно получить к ним доступ, когда вы их просматриваете Рассмотрим код ниже.

for i in range(0,len(date_list)): # iterate through dates
    weather_list = pd.read_html(base_url + 'KOWD' + '/' + year[i] + '/' + month[i] + '/' + day[i] + end_url)
    #print(type(weather_list))
    weather_list = weather_list[4] # this is the table of values I want
    weather_list.append(date_list.iloc[i])

Примечание. После запуска этого кода упомянутый вами IndexError был решен, но я получил ошибку в строке weather_list = weather_list[4]. Я проверил, и len(weather_list) всегда равно 4. Определенно, это отдельная проблема, так как list index out of range обязательно произойдет в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...