Фрейм данных выходит только с одним столбцом

#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. Спасибо, Тим, следующий шаг-определенно объединить столбцы, чтобы получить значение даты и времени.