2017-03-13 4 views
0

Ich verwende Pandas, um einige Zeitreihen Daten zu behandeln. Ich habe einen Datenrahmen in folgendem Format:Rolling Mean auf Pandas Datenrahmen Zeitreihen

   Date  Time Reading 
552726 2016/08/01 0: 0: 0 17.28 
552727 2016/08/01 0: 0: 5 17.28 
552728 2016/08/01 0: 0:10 17.21 
552729 2016/08/01 0: 0:15 17.16 
552730 2016/08/01 0: 0:20 17.11 
552731 2016/08/01 0: 0:25 17.08 
552732 2016/08/01 0: 0:30 17.18 
552733 2016/08/01 0: 0:35 17.18 
etc... 

Ich mag die Lesespalt mitteln, so dass es 10 Minuten Fenster nimmt und berechnet den Durchschnitt, und ich möchte dieses Fenster über die Zeitreihe bewegen. Dann mag ich den Datenrahmen mit den neuen gemittelten Werten aktualisiert werden, und auch die Zeitmarke, also würde es so aussehen:

  Date  Time  Reading 
552726 2016/08/01 0: 0: 0 17.30 
552727 2016/08/01 0: 10:0 17.35 
552728 2016/08/01 0: 20:0 17.20 
etc... 

Was ist der beste Weg, dies in Pandas zu tun? Ich versuchte die rollende Mittelwertmethode, indem ich eine Frequenz für das rollende Fenster aufstellte. Aber dann muss ich den Datenrahmen neu aufbauen, mit neuen Zeitstempeln, und ich denke, es gibt einen saubereren, einfacheren Weg, dies zu tun.

Vielen Dank, und bitte lassen Sie mich wissen, wenn ich die Dinge besser klären kann.

+1

Haben Sie immer alle 5 Sekunden eine Beobachtung? – FLab

+0

Ja. Sampling Rate ist 1 Probe/5 Sekunden – entropy4money

+0

Dann warum verwenden Sie nicht ein 120 Beobachtung Rolling Window? – FLab

Antwort

1

Geben Sie Ihre Daten an, sagen Sie, ich wollte Durchschnitt von 15 Sekunden Intervallen berechnen. Ich habe einfach:

#frame contains your data 
n_obs = 3 
result = frame.rolling(window = n_obs, min_periods = 1).mean().iloc[::n_obs,:] 

#   Date  Time Reading 
# 0 2016/08/01 0: 0: 0 17.280000 
# 3 2016/08/01 0: 0:15 17.216667 
# 6 2016/08/01 0: 0:30 17.123333 

Wo das Haupt „Trick“, um die Beobachtungen von mehreren n_obs auswählen.

Dies sollte für Sie arbeiten mit n_obs = 120, obwohl es impliziert viel mehr Durchschnittswerte als Sie eigentlich benötigen.

+0

Ich bin froh, dass es geholfen hat. Auch überlegen, wenn Sie die Antwort nützlich gefunden;) Ein Problem, das ich fand, ist die Darstellung der Zeit mit Stunden und Minuten mit 1 oder 2 Ziffern. Dies ist problematisch in der Umstellung auf Datetime ... Sollte das nützlich sein Ich habe diese "chaotische" Zeile gemacht, um mal in ein schönes Format zu bekommen (wie im Beispiel Listen, aber man kann sie einfach in Pandas-Serie umwandeln). Sie können damit spielen, um jeden Schritt zu verstehen time = frame.Time.values.tolist() time = Karte (Lambda x: ":". Join (x), [Karte (Lambda x: "{0: 0 > 2} ". Format (x), el.split (": ")) für el in map (lambda x: x.replace (" "," "), zeit)]) – FLab

+0

danke. Ich bin neu bei Pandas. das habe ich gemacht, aber ich benutze immer noch die Iloc-Methode für die Indizierung. – entropy4money