Über Tabellen iterieren mit Pandas?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Rodrigo
User
Beiträge: 5
Registriert: Montag 15. April 2019, 13:21

Montag 15. April 2019, 14:04

Guten Tag Zusammen

Ich habe folgendes Problem:

Ich habe eine Tabelle in folgendem Format: (sample)

fk_zaehler datum ... fuss_out objectid
288115 U15G3063865 2019-03-17T07:00:00 ... 4.0 7917228
243741 Y2G14045587 2019-03-09T15:00:00 ... 0.0 7872854
167301 YSH18065716 2019-02-11T02:00:00 ... 1.0 7796414
185801 U15G3063873 2019-02-22T09:30:00 ... 6.0 7814913
139742 U15G3063870 2019-02-12T04:30:00 ... 0.0 7768855
227022 Y2H18106792 2019-03-06T05:00:00 ... 0.0 7856135
280229 U15G3104445 2019-03-19T22:00:00 ... 5.0 7909342
279192 Y2G14045586 2019-03-20T12:30:00 ... 0.0 7908305
196636 Y2G13124876 2019-02-23T10:00:00 ... 0.0 7825749
135939 U15G3063872 2019-02-08T22:00:00 ... 19.0 7765052

mit ca. 300'000 Zeilen und ca 8 Spalten. Die Tabelle beinhaltet Werte von Fussgänger und Fahrradzählsysteme der Stadt Zürich im Viertelstundentakt. Da mich aber lediglich die Werte für jeweils den ganzen Tag interessieren, würde ich diese gerne zusammenfassen. Das heisst mich interessiert in der Kolumne "datum" nur YYYY-MM-DD. Leider steht da ja noch die Zeit dahinter.

Frage:

Wie kann ich über diese Tabelle iterieren, und alle werte von zum Beispiel "fuss_out" für jeweils einen Tag zusammenzählen?
Stecke hier irgendwie fest und wäre froh wenn mir jemand helfen könnte.

Grüsse
Benutzeravatar
ThomasL
User
Beiträge: 686
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Montag 15. April 2019, 14:58

Dafür ist das Paket Pandas die beste Wahl.
http://pandas.pydata.org/pandas-docs/stable/

Tabelle einlesen mit z.B. pandas.read_csv()
die Datumsspalte in ein DateTime Object umwandeln
und dann ein .groupby über das Datum

Es gibt viele gute Tutorials auf Youtube, z.B dieses https://www.youtube.com/watch?v=vmEHCJofslg
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Rodrigo
User
Beiträge: 5
Registriert: Montag 15. April 2019, 13:21

Montag 15. April 2019, 15:47

Danke für die rasche Antwort.
Wenn ich die Datums Kolumne in ein DateTime-Object umwandle, ist aber immer noch die Zeit hintendran also kann ich das groupby noch nicht anwenden weil sie sonst auch nach zeit gruppiert werden und nicht nach Tag.
Benutzeravatar
ThomasL
User
Beiträge: 686
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Montag 15. April 2019, 15:57

generiere aus der Datumsspalte eine neue Spalte, die nur das Datum ohne Zeit enthält und mach darüber ein groupby
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Rodrigo
User
Beiträge: 5
Registriert: Montag 15. April 2019, 13:21

Dienstag 16. April 2019, 08:52

Genau das schaffe ich leider nicht. Den Spaltenwert so zu beschneiden dass nur noch das Datum übrigbleibt
Benutzeravatar
ThomasL
User
Beiträge: 686
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Dienstag 16. April 2019, 12:59

Habe mal deine Beispieldaten in eine Textdatei kopiert

Code: Alles auswählen

import pandas as pd

# deine Beispieldaten ohne ... in doppelter Anzahl
df = pd.read_csv('sample.txt', delimiter=' ', names=['S1', 'S2', 'Datum', 'S4', 'S5'], parse_dates=[2])

# summieren der Tageswerte der Spalte S4
# entweder so
df['Tag'] = df.Datum.dt.date
summe = df.groupby(['Tag']).S4.sum().to_list()

# oder ohne zusätzliche Spalte direkt so
summe = df.groupby(df.Datum.dt.date).S4.sum().to_list()
print(summe)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Rodrigo
User
Beiträge: 5
Registriert: Montag 15. April 2019, 13:21

Dienstag 16. April 2019, 15:37

Super, so funktionierts. Besten Dank für deine Bemühungen!
Rodrigo
User
Beiträge: 5
Registriert: Montag 15. April 2019, 13:21

Sonntag 28. April 2019, 19:16

Bin auf ein weiteres Problem gestossen und zwar möchte ich einen Graphen mit Matplotlib in meinem GUI plotten. Das habe ich hinbekommen jedoch schaffe ich es nicht die Daten zu aktualisieren wenn ich im GUI andere Daten auswähle, also irgendwie funktioniert das clear nicht. entweder wird gar nichts mehr geplottet oder es wird nichts am plot geändert. Weiss jemand wo ich das clearen muss oder was ich genau falsch mache?

Code: Alles auswählen

  ...Vorheriger Code irrelevant     


        if self.RadioButton1.isChecked() == True:
            axislabel = 'Temperatur [°C]'
            
            canvas.plot(u,v,x,axislabel)
            print("Radiobutton1")
          
        if self.RadioButton2.isChecked() == True:
            axislabel = 'Regendauer [min]'  
            
            canvas.plot(u,z,x, axislabel)    
            print("Radiobutton2")
        
        self.log.append("Aktualisiert: ")
        self.log.append(time.strftime("%d.%m.%Y %H:%M:%S"))

           
            
class Canvas(FigureCanvas):
    def __init__(self, parent = None, width =7, height = 7, dpi =100):

        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)


        #self.plot()



    def plot(self,u,o,x, axislabel):
        
        
        
        
        ax = self.figure.add_subplot(111)
        ax1 = self.figure.add_subplot(111)
        
        ax.clear()
        ax1.clear()
        
        ax1.set_ylabel('Personenfrequenz', color='b')
        ax1.tick_params('y', colors='b')
        ax1.set_xlabel('Datum')
    
       
        ax.set_ylabel(axislabel, color='r')
        
        ax.tick_params('y', colors='r')
        ax1 = ax.twinx()
        
        ax.plot(u,o, "r-")
        ax1.plot(u,x)
       
        
        plt.show() 
Benutzeravatar
__blackjack__
User
Beiträge: 3371
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 2. Mai 2019, 10:51

@Rodrigo: Ein komplettes, lauffähiges, minimales Beispiel wäre nett, damit man das ausprobieren kann.

Das ``== True`` mach man übrigens nicht. Du brauchst da einen Wahrheitswert. `isChecked()` liefert einen Wahrheitswert. Der Vergleich mit `True` hat als Ergebnis genau den Wahrheitswert den `isChecked()` bereits zurückgegeben hat. Und wenn man das Gegenteil testen wollen würde, gibt es ``not`` zum negieren des `isChecked()`-Ergebnis.

In der `plot()`-Methode fügst Du anscheinend auch jedes mal einen neuen Subplot hinzu und clearst *den* – der ist doch aber zu dem Zeitpunkt noch neu, und damit leer.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Antworten