2013-09-23 3 views
5

У меня есть один набор значений, измеренный в обычное время. Скажи:Интерполяция одного временного ряда на другой в пандах

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) 

И еще множество более произвольных моментов времени, например, (в действительности эти времена не регулярная последовательность)

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

Я хочу знать значение данных интерполированных во времена в тс.
я могу сделать это в NumPy:

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) 

Но я чувствую панд имеет такую ​​функциональность, где-то в resample, reindex и т.д., но я совсем не могу получить его.

ответ

7

Вы можете объединить два временных ряда и отсортировать по индексу. Так как значения во второй серии NaN вы можете interpolate и просто выбрать из значений, которые представляют собой точку из второй серии:

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

или

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

Вы должны использовать метод = «значение» для ключевых аргументов в интерполировать, чтобы получить то же самое ответьте как в numpy pd.concat ([data, ts]). sort_index(). interpolate (method = 'values') [ts.index] – elfnor

+2

Обратите внимание на индексы, отображаемые как в ts, так и в данных – tschm

4

предположит, что вы хотели бы, чтобы оценить временные ряды ts на другом datetime_index. Этот индекс и индекс ts могут перекрываться. Я рекомендую использовать следующий групповой трюк. Это существенно избавляет от сомнительных двойных марок. Я тогда вперед интерполяция, но не стесняйтесь применять более причудливые методы

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

Вот чистый один лайнер:

ts = np.interp(ts_rng.asi8 ,data.index.asi8, data[0]) 
Смежные вопросы