2013-08-12 148 views
3

一個TimeSerie的插值只有一個值我有一個名爲pandas.core.series.TimeSeriests這樣的:使用Python /大熊貓

timestamp 
2013-08-11 14:23:50  0.3219 
2013-08-11 14:23:49  0.3222 
2013-08-11 14:19:14  0.3305 
2013-08-11 00:47:15  0.3400 
2013-08-11 00:47:15.001 0.3310 
2013-08-11 00:47:15.002 0.3310 
2013-08-10 22:38:15.003 0.3400 
2013-08-10 22:38:14  0.3403 
2013-08-10 22:38:13  0.3410 

這個TimeSerie指數不規則間隔。

我想有ts值對於給定的日期時間,例如2013-08-11 14:20:00

我只需要插ONE值,而不是整個TimeSerie

我只想用線性插值數據(2013-08-11 14:23:49)和下一個索引(2013-08-11 14:19:14)之間的函數

+0

因此,爲了使事情多一點更清晰,對於沒有在同一分鐘發生的每兩個事件,你想要一個插那麼在第一個事件發生後,這個比賽會在一分鐘內完成? –

+0

對不起,假設索引沒有重複值(2013-08-11 00:47:15:000,2013-08-11 00:47:15:001,2013-08-11 00:47:15: 002,2013-08-11 00:47:15:003) – working4coins

+0

即使你有一分鐘​​內有多個值:22:38有3個值。 –

回答

4

獲取系列的子集,僅包含目標上方和下方的條目。然後使用interpolate

def interpolate(ts, target): 
    ts1 = ts.sort_index() 
    b = (ts1.index > target).argmax() # index of first entry after target 
    s = ts1.iloc[b-1:b+1] 
    # Insert empty value at target time. 
    s = s.reindex(pd.to_datetime(list(s.index.values) + [pd.to_datetime(target)])) 
    return s.interpolate('time').loc[target] 

例子:

interpolate(ts, '2013-08-11 14:20:00') 
2013-08-11 14:20:00 0.329112 
4

感謝信丹艾倫。恐怕我沒有評論的聲望,但如果要求插入已在ts索引中定義的時間,則Dan Allan的插值函數會引發異常。例如。

s = pd.to_datetime('2015-08-26 00:00:00') 
e = pd.to_datetime('2015-08-26 00:10:00') 
ts=pd.Series([0,8000],index=[s,e]) 
interpolate(ts,pd.to_datetime('2015-08-26 00:00:00')) 

我上面的小修改爲:

def interpolate(ts, target): 
    if target in ts.index: 
     return ts[target] 
    ts1 = ts.sort_index() 
    b = (ts1.index > target).argmax() # index of first entry after target 
    s = ts1.iloc[b-1:b+1] 
    # Insert empty value at target time. 
    s = s.reindex(pd.to_datetime(list(s.index.values) + [pd.to_datetime(target)])) 
    return s.interpolate(method='time').loc[target]