2016-03-07 55 views
0

我想插入(高檔)非空閒時間序列以獲得等間隔時間序列。插入(上採樣)非等間隔時間序列與Pandas版本等間隔18.0rc1

目前我做這件事的方式如下:

  1. 採取原來的時間序列。
  2. 創建新的時間序列與NaN的在各30秒的時間間隔值(使用重採樣(「30S」)。asfreq())
  3. 的concat原始時間序列和新的時間序列
  4. 時間序列,以恢復的時間的順序排序(這我不喜歡 - 分揀具有複雜度O = N的log(n))
  5. 插值
  6. 從時間序列

有與熊貓版18.0rc1一個更簡單的方法刪除原來的點?就像在matlab中一樣,您有原始時間序列,並將新時間作爲參數傳遞給interpolation()函數以在所需時間接收值。

我說過原始時間序列的時間可能不是所需時間序列的時間子集。

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

values = [271238, 329285, 50, 260260, 263711] 
timestamps = pd.to_datetime(['2015-01-04 08:29:4', 
          '2015-01-04 08:37:05', 
          '2015-01-04 08:41:07', 
          '2015-01-04 08:43:05', 
          '2015-01-04 08:49:05']) 

ts = pd.Series(values, index=timestamps) 
ts 
ts[ts==-1] = np.nan 
newFreq=ts.resample('60S').asfreq() 

new=pd.concat([ts,newFreq]).sort_index() 
new=new.interpolate(method='time') 

ts.plot(marker='o') 
new.plot(marker='+',markersize=15) 

new[newFreq.index].plot(marker='.') 

lines, labels = plt.gca().get_legend_handles_labels() 
labels = ['original values (nonequispaced)', 'original + interpolated at new frequency (nonequispaced)', 'interpolated values without original values (equispaced!)'] 
plt.legend(lines, labels, loc='best') 
plt.show() 

image

回答

0

已經有在期望值插值(我將在鏈接編輯後,但搜索插值問題問題跟蹤器),一個簡單的方法幾個請求。所以將來會有更簡單的方法。

現在你可以多一點乾淨的

In [9]: (ts.reindex(ts.index | newFreq.index) 
      .interpolate(method='time') 
      .loc[newFreq.index]) 
Out[9]: 
2015-01-04 08:29:00    NaN 
2015-01-04 08:30:00 277996.070686 
2015-01-04 08:31:00 285236.860707 
2015-01-04 08:32:00 292477.650728 
2015-01-04 08:33:00 299718.440748 
          ... 
2015-01-04 08:45:00 261362.402778 
2015-01-04 08:46:00 261937.569444 
2015-01-04 08:47:00 262512.736111 
2015-01-04 08:48:00 263087.902778 
2015-01-04 08:49:00 263663.069444 
Freq: 60S, dtype: float64 

這仍然涉及到你上面列出的所有步驟寫的選項,但指標的unioning比concating和下滴清潔劑。