Python 列';在连接刮取的数据帧时,s类型已更改
我遇到了一些麻烦,在互联网上找不到任何答案(这是非常罕见的!!) 我正在按城市进行每日粒度的网络垃圾收集(气象数据)。 当我刮取1天时,“city”列被认为是字符串,但当我刮取超过1天(如2天)时,“city”列不再是字符串,与1天刮取时使用的代码相同,在2天刮取中不再有效 这是我的刮削代码Python 列';在连接刮取的数据帧时,s类型已更改,python,python-3.x,pandas,web-scraping,beautifulsoup,Python,Python 3.x,Pandas,Web Scraping,Beautifulsoup,我遇到了一些麻烦,在互联网上找不到任何答案(这是非常罕见的!!) 我正在按城市进行每日粒度的网络垃圾收集(气象数据)。 当我刮取1天时,“city”列被认为是字符串,但当我刮取超过1天(如2天)时,“city”列不再是字符串,与1天刮取时使用的代码相同,在2天刮取中不再有效 这是我的刮削代码 url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}' def get_weathe
url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}'
def get_weather(date):
url = url_template.format(date)
html_doc = requests.get(url).text
soup = BeautifulSoup(html_doc)
table = soup.find('table', id="extremwerte")
rows = []
for row in table.find_all('tr'):
rows.append([val.text for val in row.find_all('td')])
headers= [header.text for header in table.find_all('th')]
df = pd.DataFrame(rows[2:], columns=headers)
df['date']=date
return df
df2 = pd.DataFrame()
df2 = df2.fillna(0)
for d in pd.date_range(start='20170101', end='20170101'):
df2=pd.concat([df2,get_weather(d.strftime('%Y%m%d'))])
当我只为上面提到的20170101擦写时,下面这行代码起作用:
for i, row in df2.iterrows():
if isinstance(df2['Wetterstation\xa0'][i],str) is True:
df2.at[i,'Wetterstation\xa0']=df2['Wetterstation\xa0'][i].replace('/','-')
但是,例如,当我将结束日期更改为20170202时,代码将不起作用,并给出以下错误消息:
AttributeError:“Series”对象没有属性“encode”
你能解释一下发生了什么变化吗?为什么当我刮一天以上时,列的类型会发生变化
提前感谢您抽出时间 似乎您需要指定正确的解析器,在本例中,
lxml
(标准html.parser
产生不正确的结果)
为结束日期运行此代码20170202
:
import requests
import pandas as pd
from bs4 import BeautifulSoup
url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}'
def get_weather(date):
url = url_template.format(date)
html_doc = requests.get(url).text
soup = BeautifulSoup(html_doc, 'lxml') # <--- specify `lxml` parser
table = soup.find('table', id="extremwerte")
rows = []
for row in table.find_all('tr'):
rows.append([val.text for val in row.find_all('td')])
headers= [header.text for header in table.find_all('th')]
df = pd.DataFrame(rows[2:], columns=headers)
df['date']=date
return df
df2 = pd.DataFrame()
df2 = df2.fillna(0)
for d in pd.date_range(start='20170101', end='20170202'):
df2=pd.concat([df2,get_weather(d.strftime('%Y%m%d'))])
print(df2)
仅供参考熊猫可以使用
pd.read\u HTML(url)
将包含表格的HTML直接读取到数据帧列表中。不确定根本的问题是什么,但这可能会有所帮助。谢谢@BallpointBen,当我使用pd.read\u html(url)
时,我松开了十进制值的逗号,因此一个值(例如='5,7'将被废弃为='57'。你知道如何避免这个问题吗:)?@BallpointBen多亏了这个pd.read_html(url,decimal=',',millends=')
谢谢你的帮助!谢谢你,安德烈,不幸的是我仍然有同样的问题。例如,下面这行代码将在只有一天被废弃时起作用,但在两天被废弃时不起作用df2['Wetterstation\xa0'].split('(')[0]
这将导致以下错误:“Series”对象没有属性“split”
Wetterstation MinimumTemp.[°C] MaximumTemp.[°C] Minimum 5 cmüber dem Erd-boden (Nacht) Schnee-höhe[cm] StärksteWindböe[Bft] Nieder-schlag[l/m2] Sonnen-scheindauer[h] date
0 Aachen -5,1 1,9 -6,9 0 644 1,9 5,3 20170101
1 Ahaus (Münsterland) -1,2 0,7 -1 0 429 3,9 0 20170101
2 Albstadt (Schwäbische Alb, 759 m) -9,9 4,2 -10,8 0 7,1 20170101
3 Aldersbach (Lkr. Passau, Niederbayern) -8,3 -1,7 -7,8 0 4,9 20170101
4 Alfeld (Leine) -4,1 1,6 -4,4 0 322 1,6 1,5 20170101
.. ... ... ... ... ... ... ... ... ...
965 Zernien (N) 0 20170202
966 Zielitz (N) 0 20170202
967 Zinnwald-Georgenfeld (Erzgebirge, 877 m) -7,4 0,2 -0,2 55 540 0,5 0 20170202
968 Zugspitze -7,3 -5,3 235 12123 0 5,8 20170202
969 Zwiesel (Bayerischer Wald, 612 m) -4,4 9,3 -0,3 44 213 0,1 2,4 20170202
[27841 rows x 9 columns]