2016-10-14 5 views
2

Ich habe Sensordaten Zeitstempel. Aufgrund technischer Details bekomme ich Daten von den Sensoren bei ca. 1 Minute Intervallen. Die Daten können wie folgt aussehen:Pandas Zeitreihen resampling und interpolieren zusammen

tstamp    val 
0 2016-09-01 00:00:00 57 
1 2016-09-01 00:01:00 57 
2 2016-09-01 00:02:23 57 
3 2016-09-01 00:03:04 57 
4 2016-09-01 00:03:58 58 
5 2016-09-01 00:05:00 60 

Nun, im Wesentlichen, würde ich sehr glücklich sein, wenn ich auf die Minute genau alle Daten bekommen, aber ich weiß nicht. Die einzige Möglichkeit, die Verteilung zu erhalten und Daten in jeder Minute zu haben, besteht darin, zu interpolieren. Zum Beispiel gibt es zwischen den Zeilenindizes 1 und 2 83 Sekunden, und der natürliche Weg, um einen Wert in der genauen Minute zu erhalten, besteht darin, zwischen den zwei Datenzeilen zu interpolieren (in diesem Fall ist es 57, aber das ist nicht der Fall) überall).

Gerade jetzt, mein Ansatz ist folgendes zu tun:

date = pd.to_datetime(df['measurement_tstamp'].iloc[0].date()) 
ts_d = df['measurement_tstamp'].dt.hour * 60 * 60 +\ 
     df['measurement_tstamp'].dt.minute * 60 +\ 
     df['measurement_tstamp'].dt.second 
ts_r = np.arange(0, 24*60*60, 60) 
data = scipy.interpolate.interp1d(x=ts_d, y=df['speed'].values)(ts_r) 
req = pd.Series(data, index=pd.to_timedelta(ts_r, unit='s')) 
req.index = date + req.index 

Aber das fühlt sich eher herausgezogen und lange zu mir. Es gibt ausgezeichnete Pandas-Methoden, die Resampling, Runden usw. durchführen. Ich habe sie den ganzen Tag gelesen, aber es stellt sich heraus, dass nichts so interpoliert, wie ich es möchte. resample funktioniert wie ein groupby und mittelt Zeitpunkte, die zusammen fallen. fillna interpoliert, aber nicht nachdem resample die Daten bereits durch Mittelung geändert hat.

Fehle ich etwas, oder ist mein Ansatz das Beste, was es gibt?


Der Einfachheit halber wird angenommen, dass I-Gruppe die Daten für Tag, und durch den Sensor, so dass nur eine 24-Stunden-Zeitraum von einem Sensor zu einem Zeitpunkt interpoliert.

Antwort

6
d = df.set_index('tstamp') 
t = d.index 
r = pd.date_range(t.min().date(), periods=24*60, freq='T') 

d.reindex(t.union(r)).interpolate('index').ix[r] 

enter image description here


Hinweis, periods=24*60 Arbeiten auf Tagesdaten, nicht auf die in der Frage zur Verfügung gestellt Probe. Für dieses Beispiel funktioniert periods=6.

+0

Aber "resample" Mittelwerte, wenn zwei oder mehr Beobachtungen in der gleichen Gruppe auftreten, nicht wahr? – Kartik

+0

Also folgt diese Daten tatsächlich einer Verteilung. Im Wesentlichen möchte ich eine lineare Interpolation zwischen zwei Punkten, so dass der interpolierte Punkt genau auf die Minute fällt. Mit diesen Daten wird es niemals passieren, dass mehr als 2 Beobachtungen in einer Minute vorliegen. Tatsächlich fallen die meisten Daten genau auf die Minute, aber manchmal piept der Sensor zu spät oder zu früh. Normalerweise runden meine Kollegen es auf die nächste Minute ab und füllen fehlende Zeitstempel mit dem Wert aus den vorherigen Zeitstempeln, aber das ändert die Verteilung etwas. Ich brauche genauere Einschränkungen für mein Problem. – Kartik

+0

Schön! Kannst du das aber mit meiner Lösung in der Frage vergleichen? Ich habe einen Datensatz (nur für September), das sind ~ 114 Millionen Datensätze (2.655 Sensoren, berichtet fast 1440 Datenpunkte pro Tag). Ich denke, dass das Interpolieren bei jeder Sekunde dazu führt, dass es langsamer ist. – Kartik

Verwandte Themen