тип столбца изменен при объединении отброшенных фреймов данных - PullRequest
0 голосов
/ 13 июля 2020

У меня проблемы, и я не смог найти ответов на rnet (что очень редко !!)

Я просматриваю веб-страницы (метрологические данные) ежедневно детализация по городам. Когда я отбрасываю 1 день, столбец «город» считается строкой, но когда я сбрасываю более 1 дня, например 2 дня, столбец «город» больше не является строкой и тем же кодом, который использовался для работы когда однодневный лом больше не работает с двухдневным ломом.

Вот мой код для списания

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'

Объясните, пожалуйста, что изменилось? Почему тип столбцов меняется, когда я выбрасываю более одного дня?

Заранее спасибо за ваше время!

1 Ответ

0 голосов
/ 13 июля 2020

Похоже, вам нужно указать правильный синтаксический анализатор, в данном случае 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)

Производит:

                               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]
...