Forum: PC-Programmierung Python plotten von Zeiten/Preisen als Diagramm


von Lars (Gast)


Lesenswert?

Hallo,
ich habe in Python eine Liste mit zwei reihen und möchte diese gerne 
Plotten.
Aber ich denke, irgendwas stimmt mit dem Format nicht. Dabei handelt es 
sich um Uhrzeiten und Preise die ich aus einer HTML auswerte.
1
datas=[]
1
    for absatz in absaetze:
2
        priceTemp = absatz.find('span', attrs = {'class' : 'fareOutput'})
3
        temp = priceTemp.text.split()
4
        y = temp[len(temp)-2]
5
        #print(y[len(y)-2])
6
7
        dateTemp = absatz.find_all('a')[1]
8
        temp = str(dateTemp).split()
9
        x = temp[len(temp)-2]
10
        #print(x[len(x)-2])
11
12
        #print(x[len(x)-2] + '\t' + y[len(y)-2])
13
        datas.append([x,y])
14
15
    data=np.array(datas)

das ergibt folgende Ausgabe
datas:
1
[['07:06', '22,90'], ['07:38', '24,90'], ['08:38', '24,90'], ['21:38', '24,90'], ['22:38', '24,90'], ['09:38', '26,90'], ['10:38', '26,90'], ['20:06', '26,90'], ['09:06', '39,90'], ['10:06', '39,90'], ['19:38', '39,90'], ['20:38', '39,90'], ['13:03', '43,90'], ['11:38', '45,90'], ['12:06', '45,90'], ['12:38', '45,90'], ['14:03', '45,90'], ['16:38', '45,90'], ['17:38', '45,90'], ['14:38', '47,90'], ['16:03', '49,90'], ['18:38', '49,90'], ['15:38', '51,90'], ['18:05', '51,90'], ['13:38', '75,90'], ['17:06', '87,90'], ['15:06', '127,20'], ['19:06', '127,20']]
data:
1
[['07:06' '22,90']
2
 ['07:38' '24,90']
3
 ['08:38' '24,90']
4
 ['21:38' '24,90']
5
 ['22:38' '24,90']
6
 ['09:38' '26,90']
7
 ['10:38' '26,90']
8
 ['20:06' '26,90']
9
 ['09:06' '39,90']
10
 ['10:06' '39,90']
11
 ['19:38' '39,90']
12
 ['20:38' '39,90']
13
 ['13:03' '43,90']
14
 ['11:38' '45,90']
15
 ['12:06' '45,90']
16
 ['12:38' '45,90']
17
 ['14:03' '45,90']
18
 ['16:38' '45,90']
19
 ['17:38' '45,90']
20
 ['14:38' '47,90']
21
 ['16:03' '49,90']
22
 ['18:38' '49,90']
23
 ['15:38' '51,90']
24
 ['18:05' '51,90']
25
 ['13:38' '75,90']
26
 ['17:06' '87,90']
27
 ['15:06' '127,20']
28
 ['19:06' '127,20']]

1
plt.bar(datas)
2
plt.show()
oder
1
plt.bar(data)
2
plt.show()
bringt jeweils den Error:
TypeError: bar() missing 1 required positional argument: 'height'

am liebsten würde ich gerne direkt datas plotten, da ich diesen einfach 
mit
1
datas.sort()

sortieren kann.
Mit data wird mir da alles nur durcheinander gebracht

Bsp absatz:
1
<div class="connectionPrice">
2
<div class="farePep lastrow button-inside tablebutton borderright"><span><span><span class="fareOutput"><span class="farePrefix">ab</span> 12,90&nbsp;&euro;</span></span></span></div><div class="fareStd button-inside tablebutton center">
3
<span class="button-border "><a class="buttonbold" h r e f="https://reiseauskunft.bahn.de/bin/query.exe/dn?ld=43109&amp;protocol=https:&amp;seqnr=3&amp;ident=a8.07064109.1655184274&amp;rt=1&amp;currentTBPSlot=1&amp;currentTBPConId=A1-0&amp;M=D&amp;E=T&amp;VH=T$A=1@O=Berlin Hbf (tief)@L=8098160@a=0@$A=1@O=Hamburg Hbf@L=8002549@a=0@$202210030706$202210030911$IC  2070$$1$$$$$$&amp;tbpReconstructionMode=out&amp;sTID=A1-0.1&amp;oCID=A1-0&amp;showAvail=yes&amp;completeFulfillment=1&amp;" title="Buchen Sie in den folgenden Schritten Ihre Fahrkarte/Sitzplatzreservierung f&#252;r Berlin Hbf &#x0028;tief&#x0029; - Hamburg Hbf ab 07:06 " ><span></span></a></span>
4
</div>

von Dirk B. (dirkb2)


Lesenswert?

Du hast da eine Liste mit Strings.
Zum Plotten braucht man Werte.
Ja, auch die Zeit kann man in eine Zahl umwandeln.

Die allermeisten Programmiersprachen arbeiten mit einem Punkt als 
Dezimaltrenner.

von Helmut H. (helmuth)


Lesenswert?

Lars schrieb:
> bringt jeweils den Error:
> TypeError: bar() missing 1 required positional argument: 'height'

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar.html
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, 
align='center', data=None, **kwargs)

von Lars (Gast)


Lesenswert?

juhu,

habe es hinbekommen.
Danke für die Hinweise

von Ein T. (ein_typ)


Lesenswert?

Lars schrieb:
> habe es hinbekommen.
> Danke für die Hinweise

Nebenbei bemerkt, ist es zwar für die Konvertierung von Zahlennotationen 
mit Dezimalkomma und Tausenderpunkt oder umgekehrt zwar verführerisch, 
aber häufig fehlerbehaftet, die Zeichen mit der Methode str.replace zu 
ersetzen. Stattdessen bietet Python dazu ein Modul namens "locale" an:
1
>>> import locale
2
>>> locale.setlocale(locale.LC_ALL, 'de_DE.utf-8')
3
'de_DE.utf-8'
4
>>> locale.atof('4,5')
5
4.5

Viel Erfolg! ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.