#python #pandas #beautifulsoup
Вопрос:
Прежде всего, приношу извинения за отсутствие у меня здесь знаний в области программирования!! Любые указатели будут очень признательны!!
Это код, который я написал для считывания данных с метеорологического буя NDBC 41049. Мой план здесь состоит в том, чтобы получить данные, которые работают, очистить пробелы и заменить их запятыми, а затем создать фрейм данных из csv. string_data очень хорошо печатается с python, но фрейм данных выводится только в виде одного столбца?
import requests
from bs4 import BeautifulSoup
import re
import shlex
import pandas as pd
import io
file = requests.get("https://www.ndbc.noaa.gov/data/realtime2/41049.spec")
swell_data = BeautifulSoup(file.content, "html.parser")
string_data = swell_data.get_text("swell_data")
re.sub("string_data ", ",", string_data.strip())
','.join(shlex.split(string_data))
print (string_data)
df = pd.read_csv(io.StringIO(string_data), sep=",")
df
Комментарии:
1. Эта страница не возвращает HTML-данные, поэтому BeautifulSoup абсолютно неверен. Вы смотрели на это в браузере? Это обычный текстовый файл с данными в фиксированных столбцах.
Ответ №1:
Панды могут читать непосредственно с URL-адреса. И готов читать белые разделенные столбцы с одним или несколькими пробелами. Кроме того, вы можете пропустить первую строку в файле:
import pandas as pd
data = pd.read_csv(
"https://www.ndbc.noaa.gov/data/realtime2/41049.spec",
delim_whitespace=True, skiprows=1)
data
#yr mo dy hr mn m m.1 sec m.2 sec.1 - degT -.1 sec.2 degT.1
0 2021 9 22 20 40 2.8 2.1 12.9 1.8 7.1 NE NE SWELL 7.3 37
1 2021 9 22 19 40 2.7 1.7 13.8 2.0 8.3 NE NE AVERAGE 6.8 39
2 2021 9 22 18 40 2.8 2.2 13.8 1.7 6.7 NNE ENE SWELL 7.0 32
3 2021 9 22 17 40 2.5 1.6 13.8 2.0 6.7 NE ENE AVERAGE 6.6 39
4 2021 9 22 16 40 2.4 1.4 13.8 2.0 7.1 NE ENE AVERAGE 6.2 34
... ... .. .. .. .. ... ... ... ... ... ... ... ... ... ...
1094 2021 8 8 4 40 1.2 1.1 7.7 0.5 4.8 ENE E AVERAGE 5.8 59
1095 2021 8 8 3 40 1.3 1.2 8.3 0.5 4.8 ENE E AVERAGE 5.9 75
1096 2021 8 8 2 40 1.3 1.2 7.7 0.5 4.3 E ENE AVERAGE 5.9 79
1097 2021 8 8 1 40 1.3 1.2 8.3 0.5 4.3 E E AVERAGE 6.1 85
1098 2021 8 8 0 40 1.4 1.3 9.1 0.6 4.8 E E SWELL 6.1 91
[1099 rows x 15 columns]
Комментарии:
1. Спасибо, что помогли мне увидеть разницу между типами файлов. Это большая помощь в продвижении этого проекта!
Ответ №2:
Это делает довольно хорошую работу. На моем месте я бы хотел объединить эти первые 5 столбцов в значение даты и времени, но это упражнение для читателя. Вероятно, вы хотите удалить первую или вторую строку; pandas не обрабатывает две строки заголовков.
import requests
import pandas as pd
import io
import re
data = requests.get("https://www.ndbc.noaa.gov/data/realtime2/41049.spec")
swell_data = data.content
string_data = re.sub(" "," ", swell_data.decode('ascii'))
print(string_data)
df = pd.read_csv(io.StringIO(string_data), sep=" ")
print(df)
Выход:
#YY MM DD hh mm WVHT SwH SwP WWH WWP SwD WWD STEEPNESS APD MWD
0 #yr mo dy hr mn m m sec m sec - degT - sec degT
1 2021 09 22 20 40 2.8 2.1 12.9 1.8 7.1 NE NE SWELL 7.3 37
2 2021 09 22 19 40 2.7 1.7 13.8 2.0 8.3 NE NE AVERAGE 6.8 39
3 2021 09 22 18 40 2.8 2.2 13.8 1.7 6.7 NNE ENE SWELL 7.0 32
4 2021 09 22 17 40 2.5 1.6 13.8 2.0 6.7 NE ENE AVERAGE 6.6 39
... ... .. .. .. .. ... ... ... ... ... ... ... ... ... ...
1095 2021 08 08 04 40 1.2 1.1 7.7 0.5 4.8 ENE E AVERAGE 5.8 59
1096 2021 08 08 03 40 1.3 1.2 8.3 0.5 4.8 ENE E AVERAGE 5.9 75
1097 2021 08 08 02 40 1.3 1.2 7.7 0.5 4.3 E ENE AVERAGE 5.9 79
1098 2021 08 08 01 40 1.3 1.2 8.3 0.5 4.3 E E AVERAGE 6.1 85
1099 2021 08 08 00 40 1.4 1.3 9.1 0.6 4.8 E E SWELL 6.1 91
[1100 rows x 15 columns]
Комментарии:
1. Спасибо, Тим, следующий шаг-определенно объединить столбцы, чтобы получить значение даты и времени.