【问题标题】:Dataframe comes out with only one column数据框只有一列
【发布时间】:2021-09-22 21:34:09
【问题描述】:

首先对我在这里缺乏编码知识表示歉意!任何指针将不胜感激!

这是我为从 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

【问题讨论】:

  • 那个页面没有返回HTML数据,所以BeautifulSoup是绝对错误的。您在浏览器中查看过它吗?它是在固定列中包含数据的纯文本文件。

标签: python pandas beautifulsoup


【解决方案1】:

Pandas 可以直接从 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]

【讨论】:

  • 感谢您帮助我了解文件类型之间的区别。这对推进这个项目有很大帮助!
【解决方案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]

【讨论】:

  • 谢谢蒂姆,下一步肯定是合并列以获得日期时间值。
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 2012-04-14
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2014-11-13
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多