Interpolando una serie de tiempo a otra en pandas

Tengo un conjunto de valores medidos en tiempos regulares. Decir:

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) 

Y otro conjunto de tiempos más arbitrarios, por ejemplo, (en realidad estos tiempos no son una secuencia regular)

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

Quiero saber el valor de los datos interpolados en los momentos en ts.
Puedo hacer esto en cantidad:

 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) 

Pero siento que los pandas tienen esta funcionalidad en algún lugar como resample , reindex , etc. pero no puedo entenderlo.

Puede concatenar las dos series de tiempo y ordenarlas por índice. Como los valores de la segunda serie son NaN , puede interpolate y simplemente seleccionar los valores que representan los puntos de la segunda serie:

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

o

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

Supongamos que desea evaluar una serie de tiempo ts en un datetime_index diferente. Este índice y el índice de ts pueden superponerse. Recomiendo usar el siguiente truco groupby. Esencialmente se deshace de los dobles sellos dudosos. Luego reenvío la interpolación, pero me siento libre de aplicar métodos más sofisticados.

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

Aquí hay un trazador de líneas limpio:

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