Запрос Python для процедуры на основе URL-адреса для автоматической загрузки данных с веб-сайта Climate (http://www.climate.weather.gc.ca) - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать программу, которая загружает файл .csv и помещает его в файл данных pandas.В инструкции предлагается использовать wget в linux, но он не работает должным образом, когда я использую 'http.ID={a}/.data'.format(a) для вставки различных метеостанций из словаря, который я создал для всех метеостанций, которые я должен отслеживать.Вот читайте меня с сайта правительства Канады.

-----------------------------------------------------------------------


Readme.txt

Процедура на основе URL-адреса для автоматической загрузки данных с веб-сайта Climate (http://www.climate.weather.gc.ca) Версия: 2016-05-10


ИЗМЕНЕНИЕ ОКРУЖАЮЩЕЙ СРЕДЫ И ИЗМЕНЕНИЯ КЛИМАТА КАНАДА

Чтобы прочитать этот файл в Интернете, посетите:

ftp: //client_climate@ftp.tor.ec.gc.ca/Pub/Get_More_Data_Plus_de_donnees/

Папка: Get_More_Data_Plus_de_donnees> Readme.txt

Инструкции по загрузке всех данных о погоде для одной станции с веб-сайта по окружающей среде и изменению климата Канады:

Ежедневно обновляемый список климатических станций в Национальном архиве,включая их идентификатор климата, идентификатор станции, идентификатор ВМО, идентификатор TC и координаты, которые можно найти в следующей папке:
Get_More_Data_Plus_de_donnees> Инвентаризация станции EN.csv

Используйте следующую утилиту для перехода внизЗагрузка данных: wget (операционные системы GNU / Linux) Cygwin (операционные системы Windows) https://www.cygwin.com Homebrew (OS X - Apple) http://brew.sh/ Пример загрузки всех доступных почасовых данных для Yellowknife A с 1998 по2008, в формате .csv

Командная строка:

for year in `seq 1998 2008`;do for month in `seq 1 12`;do wget --  content-disposition 
"http://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID=1706&Year=${year}&Month=${month}&Day=14&timeframe=1&submit= Download+Data" ;done;done

WHERE;

year = изменить значения в командной строке (seq 1998 2008)

month = изменить значения в командной строке (seq 1 12)

format = [csv | xml]:формат вывода

таймфрейм = 1: для часовых данных

таймфрейм = 2: для суточных данных

таймфрейм = 3 для месячных данных

День:значение переменной «день» не используется и может быть произвольным значением

Для другой станции измените значение переменной stationID

Для данных в формате XML измените значениеформат переменной xml в URL.

Для получения информации на французском языке измените Download + Data с помощью

++ T% C3% A9l% C3% A9зарядное устройство +% 0D% 0Ades + donn% C3% A9es, также измените _e с _f вURL.

По вопросам или проблемам, пожалуйста, свяжитесь с нашим национальным офисом климатического обслуживания по адресу: ec.services.climatiques-climate.services.ec@canada.ca

-----------------------------------------------------------------------


Изначально я использовал wget для загрузки CSV-файла по этой ссылке.Это работает без .format (ID, год) ....

Это работает:

"http://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID=50308&Year=2019&Month=3&Day=14&timeframe=2&submit= Download+Data"

Но это не так:

"http://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID={}&Year={}&Month=3&Day=14&timeframe=2&submit= Download+Data".format(ID,year)

Мне нужночтобы иметь возможность вставлять разные годы и идентификаторы станций.

Это не работает, независимо от того, какой идентификатор у меня все та же погода.Это дает результат, но это не метеостанция с идентификатором 50308.

ID = '50308'
year = '2019'
!wget -O Weather.csv"http://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID={}&Year={}&Month=3&Day=14&timeframe=2&submit= Download+Data".format(ID,year) 

df = pd.read_csv('Weather.csv',skiprows = 24)

, что я пытаюсь заменить вышеупомянутое утверждение:

import pandas as pd
import io
import requests

ID = '49088'
year = '2019'


url="http://climate.weather.gc.ca/climate_data/bulk_data_e.html?format=csv&stationID={}&Year={}&Month=3&Day=14&timeframe=2&submit= Download+Data".format(ID,year)    
s=requests.get(url).content
c=pd.read_csv(io.StringIO(s.decode('utf-8')))

Воткод ошибки, который он выдает:

ParserError: Error tokenizing data. C error: Expected 2 fields in line 26, saw 27

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

1 Ответ

0 голосов
/ 01 февраля 2019

Хорошо, функция запросов извлекает .csv нормально, ошибка в том, что pandas не может правильно прочитать csv.Загружаемый файл начинается со строк, которые содержат два поля перед пустой строкой и собственно данными.Может быть, вам не нужно, чтобы вступление преобразовывалось в panda:

"Station Name","DELTA BURNS BOG"
"Province","BRITISH COLUMBIA"
"Current Station Operator","Environment and Climate Change Canada - Meteorological Service of Canada"
"Latitude","49.13"
"Longitude","-123.00"
"Elevation","3.10"
 .. etc ...

для первых 24 строк, затем пробел, а остальное - ваши данные:

"Date/Time","Year","Month","Day","Data Quality","Max Temp (°C)","Max Temp Flag","Min Temp (°C)","Min Temp Flag","Mean Temp (°C)","Mean Temp Flag","Heat Deg Days (°C)","Heat Deg Days Flag","Cool Deg Days (°C)","Cool Deg Days Flag","Total Rain (mm)","Total Rain Flag","Total Snow (cm)","Total Snow Flag","Total Precip (mm)","Total Precip Flag","Snow on Grnd (cm)","Snow on Grnd Flag","Dir of Max Gust (10s deg)","Dir of Max Gust Flag","Spd of Max Gust (km/h)","Spd of Max Gust Flag"
"2019-01-01","2019","01","01","","5.3","","-0.6","","2.4","","15.6","","0.0","","","","","M","0.0","","","","","","",""
"2019-01-02","2019","01","02","","5.2","","0.6","","2.9","","15.1","","0.0","","","","","M","3.4","","","","","","",""
"2019-01-03","2019","01","03","","9.1","","3.4","","6.2","","11.8","","0.0","","","","","M","61.0","","","","","","",""
...

Так что, если вы скажете пандамчтобы пропустить первые 25 (?) строк, вам следует избегать проблем с синтаксическим анализом:

h=pd.read_csv(io.StringIO(s.decode('utf-8')), skiprows = 25)

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

...