Import Pandas dataframe do bazy MySQL

0

Witam serdecznie, już od 3 dni walczę z importem danych pobranych z pliku html do dataframe i importem owych danych do bazy MySQL.
Jestem początkujący i raczej z tych co starają się sami rozwiązywać kłopoty, ale trafił mnie taki którego nie rozumiem i zupełnie nie wiem od czego zacząć.
Mój kod wygląda tak:

from datetime import datetime
from administracja import app
import pandas as pd
from pathlib import Path
from config import Config
from sqlalchemy import create_engine





@app.route('/import_danych')
def import_zamowien():
    """Tu nastepuje wgranie danych do bazy"""
    folder = Path('C:/Users/Tomek/PycharmProjects/JCCh_flask_v2/raporty/raport_ogolny-dostaw_2021-11-01-2021-11-10_wszyscy.xls')
    pobieranie = pd.read_html(folder, header=0, index_col=0) #, flavor='lxml'

    pobrane = pobieranie[0]
    print(type(pobrane))
    for item in pobrane:
        item['Data dodania'] = datetime.strptime(item['Data dodania'], "%d.%m.%y").date()
        item['Data odbioru'] = datetime.strptime(item['Data odbioru'], '%d.%m.%Y').date()
        item['Data dostarczenia'] = datetime.strptime(item['Data dostarczenia'], '%d.%m.%Y').date()
        item['Realna data odbioru'] = datetime.strptime(item['Realna data odbioru'], '%d.%m.%Y').date()
        item['Realna data dostawy'] = datetime.strptime(item['Realna data dostawy'], '%d.%m.%Y').date()
        item['Godzina dodania'] = datetime.strptime(item['Godzina dodania'], 'HH:MM').time()
        item['Czas przygotowania (min)'] = datetime.strptime(item['Czas przygotowania (min)'], 'MM:SS').time()
        item['Czas na miejscu (odbiór)'] = datetime.strptime(item['Czas na miejscu (odbiór)'], 'HH:MM').time()
        item['Czas na miejscu (dostawa)'] = datetime.strptime(item['Czas na miejscu (dostawa)'], 'HH:MM').time()
        item['Godzina odbioru'] = datetime.strptime(item['Godzina odbioru'], 'HH:MM').time()
        item['Godzina dostarczenia'] = datetime.strptime(item['Godzina dostarczenia'], 'HH:MM').time()
        item['Realny czas odbioru'] = datetime.strptime(item['Realny czas odbioru'], 'HH:MM').time()
        item['Realny czas dostawy'] = datetime.strptime(item['Realny czas dostawy'], 'HH:MM').time()
        item['Numer telefonu odbiorcy'] = datetime.strptime(item['Numer telefonu odbiorcy'], 'HH:MM').time()
        item['Numer telefonu odbiorcy'] = float(item['Godzina odbioru'])
        item['Dystans dla samochodu(km)'] = float(item['Dystans dla samochodu(km)'])

    my_conn = create_engine(Config.SQLALCHEMY_DATABASE_URI, encoding='utf8', echo=True)

    query='INSERT INTO  jedz_co_chcesz.dane (numer_zamowienia, nazwa_klienta, adres_klienta, telefon_odbiorcy, aders_odbiorcy, dystans, kierowca, data_dodania,godzina_dodania, \
                                            czas_przygotowania,czas_na_miejscu_odbior,czas_na_miejscu_dostawa,data_odbioru, godzina_odbioru, data_dostarczenia, godzina_dostarczenia, kwota, \
                                            oplata_za_dowoz, forma_platnosci, status, realna_data_odbioru, realna_godzina_odbioru, realna_data_dostarczenia, realna_godzina_dostarczenia, \
                                            dodatkowe_1, dodatkowe_2, oplaty_1, oplaty_2, koszt_dowozu, zrodlo \
            VALUES(%s,%s,%s,%i,%s,%i,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s,%i,%s,%s,%d,%d,%d,%d,%s,%s,%s,%s,%i,%s)'
    
    my_data=(pobrane['Numer zamówienia'], pobrane['Nazwa klienta'],pobrane['Adres klienta'], pobrane['Numer telefonu odbiorcy'],
            pobrane['Adres odbiorcy'], pobrane['Dystans dla samochodu(km)'], pobrane['Kierowca'],pobrane['Data dodania'], pobrane['Godzina dodania'],
            pobrane['Czas przygotowania (min)'], pobrane['Czas na miejscu (odbiór)'],pobrane['Czas na miejscu (dostawa)'],pobrane['Data odbioru'],
            pobrane['Godzina odbioru'],pobrane['Data dostarczenia'],pobrane['Godzina dostarczenia'],pobrane['Kwota'],pobrane['Opłata za dowóz (jedzcochcesz)'],
            pobrane['Forma płatności'],pobrane['Status'],pobrane['Realna data odbioru'],pobrane['Realny czas odbioru'], pobrane['Realna data dostawy'],
            pobrane['Realny czas dostawy'],pobrane['Dodatkowe-1'],pobrane['Dodatkowe-2'], pobrane['Opłaty'],pobrane['Opłaty'],pobrane['Koszt dowozu'], pobrane['Źródło'])


    my_conn.execute(query,my_data)
    
    pass

Tam na pierwszy rzut oka może zakuć ze plik ma rozszerzenie xls a importowany jest html, to tak ma byc :) Przerabiałem to już w pliku Excel i niestety pracuje na takim dziwnym tworze, no i tak właściwie skrypt tu błędu nie widzi, za to widzi tu:
item['Data dodania'] = datetime.strptime(item['Data dodania'], "%d.%m.%y").date()
TypeError: string indices must be integers
Co to znaczy? To znaczy wiem co to znaczy po polsku ale co to może znaczyć w kontekście stringa przechowującego datę?
Całkowicie mnie to zablokowało, tak właściwie nawet nie miałem jeszcze okazji przetestować reszty tego kodu bo cały czas walczę z tym błędem.
Bardzo proszę o pomoc.

1
item['Data dodania'] = datetime.strptime(item['Data dodania'], "%d.%m.%y").date()
TypeError: string indices must be integers

To znaczy że item jest typu string u Ciebie, zamiast dict albo DataFrame.

Myślę że najwiekszy problem jest taki że nie wiesz co robisz, bo zamiast iterować po pobieranie, iterujesz po pobrane, i wsadzasz w każdej iteracji nowe dane do tego samego, czyli do item zamiast do listy itemów.

0

@TomRiddle: Oczywiście racja :) dziękuję za podpowiedź, wszystko działa do momentu w którym nie natrafię na 'nan' w danych...
Ale to chyba temat na inny wątek :D
Jeszcze raz dzięki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1