2015-05-29 33 views
11

Ich verwende Python Pandas zum ersten Mal. Ich habe 5-min Verzögerung Verkehrsdaten im CSV-Format:Python Pandas Zeitreihe Interpolation und Regularisierung

... 
2015-01-04 08:29:05,271238 
2015-01-04 08:34:05,329285 
2015-01-04 08:39:05,-1 
2015-01-04 08:44:05,260260 
2015-01-04 08:49:05,263711 
... 

Es gibt mehrere Probleme:

  • für einige Zeitstempel gibt die Daten (-1)
  • fehlende Einträge fehlt (auch 2/3 aufeinanderfolgende Stunden)
  • die Häufigkeit der Beobachtungen sind nicht genau 5 Minuten, verliert aber tatsächlich einige Sekunden ab und zu

Ich möchte eine regelmäßige Zeitreihe erhalten, also mit Einträgen alle (genau) 5 Minuten (und keine fehlenden Valus). Ich habe interpoliert erfolgreich die Zeitreihe mit dem folgenden Code, um die -1 Werte mit diesem Code zu nähern:

ts = pd.TimeSeries(values, index=timestamps) 
ts.interpolate(method='cubic', downcast='infer') 

Wie kann ich beide interpolieren und die Häufigkeit der Beobachtungen regularisieren? Danke euch allen für die Hilfe.

Antwort

17

Ändern Sie die -1 s NaNs:

ts[ts==-1] = np.nan 

dann die Daten neu berechnen 5-Minuten-Takt haben.

ts = ts.resample('5T') 

Beachten Sie, dass standardmäßig, wenn zwei Messungen fallen in den gleichen Zeitraum von 5 Minuten, resample mittelt die gemeinsam Werte.

Schließlich könnte man linear die Zeitreihe Interpolation nach der Zeit:

ts = ts.interpolate(method='time') 

Da es wie Ihre Daten sieht bereits etwa einen 5-Minuten-Takt, Sie müssen möglicherweise auf Resampling eine kürzere Frequenz so kubische Spline-Interpolation oder kann die Kurve glätten:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

values = [271238, 329285, -1, 260260, 263711] 
timestamps = pd.to_datetime(['2015-01-04 08:29:05', 
          '2015-01-04 08:34:05', 
          '2015-01-04 08:39:05', 
          '2015-01-04 08:44:05', 
          '2015-01-04 08:49:05']) 

ts = pd.Series(values, index=timestamps) 
ts[ts==-1] = np.nan 
ts = ts.resample('T', how='mean') 

ts.interpolate(method='spline', order=3).plot() 
ts.interpolate(method='time').plot() 
lines, labels = plt.gca().get_legend_handles_labels() 
labels = ['spline', 'time'] 
plt.legend(lines, labels, loc='best') 
plt.show() 

enter image description here

+0

Vielen Dank, es funktioniert perfekt! Es gibt einen Weg, wie ich stattdessen die regulären 5-Minuten-Zeitstempel zu der Serie mit nan als Werte hinzufügen und sie dann mit einem 3-Spline-Befehl interpolieren kann? – riccamini

+0

Ich verstehe nicht, was du meinst "füge die regulären 5 Minuten Zeitstempel zu der Serie mit nan als Werte hinzu", aber ich habe ein Beispiel hinzugefügt, das die Interpolation nach "time" und mit order-3 Splines zeigt. – unutbu

+0

Ich meine, es wäre ein Unterschied, wenn stattdessen linear die Zeitreihe mit ** resample() ** interpoliert, wir bauen zuerst eine Zeitreihe mit den einfachen Einträgen in den Daten, dann fügen wir Einträge vom Typ 2015- 01-01-08: 00, nan 2015-01-01-08: 05, nan und so weiter, und schließlich interpolieren sie mit einem Auftrag 3 Spline? – riccamini