2013-09-23 11 views
5

Ich habe einen Satz von Werten zu regelmäßigen Zeiten gemessen. Sprich:Interpolieren einer Zeitreihe auf andere in Pandas

import pandas as pd 
import numpy as np 
rng = pd.date_range('2013-01-01', periods=12, freq='H') 
data = pd.Series(np.random.randn(len(rng)), index=rng) 

Und ein anderer Satz von mehr beliebigen Zeiten, zum Beispiel (in Wirklichkeit ist diese Zeiten nicht eine reguläre Folge)

ts_rng = pd.date_range('2013-01-01 01:11:21', periods=7, freq='87Min') 
ts = pd.Series(index=ts_rng) 

ich den Wert der Daten zu den Zeiten interpolierten wissen will in ts.
Ich kann das numpy in tun:

x = np.asarray(ts_rng,dtype=np.float64) 
xp = np.asarray(data.index,dtype=np.float64) 
fp = np.asarray(data) 
ts[:] = np.interp(x,xp,fp) 

Aber ich Pandas fühlen hat diese Funktionalität irgendwo in resample, reindex usw., aber ich kann es nicht recht bekommen.

Antwort

7

Sie können die beiden Zeitreihen verketten und nach Index sortieren. Da die Werte in der zweiten Reihe NaN sind, können Sie interpolate und die nur die Werte wählen aus, die die Punkte aus der zweiten Reihe darstellen:

pd.concat([data, ts]).sort_index().interpolate().reindex(ts.index) 

oder

pd.concat([data, ts]).sort_index().interpolate()[ts.index] 
+3

Sie müssen für die wichtigsten Argumente in interpolieren verwenden method = ‚Werte‘, das gleiche zu erhalten Antwort wie in numpy pd.concat ([Daten, ts]). sort_index(). interpolieren (Methode = 'Werte') [ts.index] – elfnor

+2

Achten Sie auf Indizes, die sowohl in ts als auch in Daten angezeigt werden – tschm

4

Angenommen, Sie möchten ein bewerten Zeitreihen ts auf einem anderen Datumtime_index. Dieser Index und der Index von ts können sich überlappen. Ich empfehle den folgenden groupby Trick zu verwenden. Dies beseitigt im Wesentlichen zweifelhafte Doppelmarken. Ich habe dann interpolieren nach vorn, aber fühlen Sie sich frei mehr Phantasie Methoden

def interpolate(ts, datetime_index): 
    x = pd.concat([ts, pd.TimeSeries(index=datetime_index)]) 
    return x.groupby(x.index).first().sort_index().fillna(method="ffill")[datetime_index] 
0

Hier ist eine saubere Motto gelten:

ts = np.interp(ts_rng.asi8 ,data.index.asi8, data[0]) 
Verwandte Themen