2015-05-29 16 views
11

Używam Pand Pythona po raz pierwszy. Mam 5-minutowym opóźnieniem danych o ruchu w formacie csv:Python pandy, interpolacja i regulacja szeregów czasowych

... 
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 
... 

Istnieje kilka kwestii:

  • dla niektórych znaczników czasu nie brakuje danych (-1)
  • brakujące wpisy (również 2/3 kolejne godziny)
  • częstotliwość obserwacji nie jest dokładnie 5 minut, ale w rzeczywistości traci kilka sekund raz na jakiś czas

Chciałbym uzyskać regularne serie czasowe, więc z wpisami co (dokładnie) 5 minut (i brak braków). I udało się interpolowane szereg czasowy z następującego kodu do zbliżenia wartości -1 z tym kodem:

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

Jak mogę zarówno interpolacji i uregulować częstotliwość obserwacji? Dziękuję wszystkim za pomoc.

Odpowiedz

17

Zmienić -1 s do Nans:

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

Następnie resample dane mają częstotliwość 5 minut.

ts = ts.resample('5T') 

Należy pamiętać, że domyślnie, jeżeli dwa pomiary mieszczą się w tym samym okresie 5 minut, resample uśrednia wartości razem.

Wreszcie, można liniowo interpolować szeregi czasowe według czasu:

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

Ponieważ wygląda danych ma już z grubsza częstotliwość 5 minut, można trzeba resample w krótszy częstotliwości tak, sześcienny lub wielowypustowy interpolacji mogą wygładzić krzywą:

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

Dziękuję, że działa idealnie! Jest sposób, w jaki mogę zamiast tego dodać zwykłe 5-minutowe znaczniki czasu do serii z wartościami nan jako wartościami, a następnie interpolować je za pomocą splajnu 3 rzędu? – riccamini

+0

Nie rozumiem, co masz na myśli przez "dodawanie zwykłych 5-minutowych znaczników czasu do serii z wartościami nan jako wartościami", ale dodałem przykład pokazujący interpolację według 'czasu' i spacji-3. – unutbu

+0

Mam na myśli różnicę, jeśli zamiast tego liniowo interpolować szeregi czasowe za pomocą ** resample() **, najpierw budujemy serie czasowe ze zwykłymi wpisami w danych, a następnie dodajemy wpisy typu 2015- 01-01-08: 00, nan 2015-01-01-08: 05, nan i tak dalej, a na końcu wstawić je za pomocą 3 spline? – riccamini

Powiązane problemy