2013-02-28 55 views
2

這是一個人爲設計的例子,可以方便地保存數據,但總的來說,這應該是一個適用於廣泛受衆的問題。將一個時間序列的數據分配到另一個時間序列

我有一個時間序列的測量值,如下所示:

In [1]: import pandas as pd 

In [2]: index = pd.date_range(start="18:10",periods=20,freq='min') 

In [3]: df = pd.DataFrame(randn(20,3),columns=list('abc'),index=index) 

In [4]: df.head() 
Out[4]: 
          a   b   c 
2013-02-27 18:10:00 -1.344753 0.438351 1.561849 
2013-02-27 18:11:00 1.715643 1.601984 -0.027408 
2013-02-27 18:12:00 -0.142264 -0.049462 0.482493 
2013-02-27 18:13:00 0.132617 0.737902 -0.347620 
2013-02-27 18:14:00 1.277257 0.083401 0.649422 

在「真實」測量之間,校準測量被完成,但在比測量,例如一個低得多的頻率像這樣:

In [5]: calindex = pd.date_range("18:12:30",periods=4,freq='5min') 

In [6]: caldata = pd.Series([10,20,30,40],index = calindex) 

In [7]: caldata 
Out[7]: 
2013-02-27 18:12:30 10 
2013-02-27 18:17:30 20 
2013-02-27 18:22:30 30 
2013-02-27 18:27:30 40 
Freq: 5T 

現在的一般想法是將這些校準數據應用於測量。 爲此,我想通過'最接近時間'的方法分配/廣播校準數據,所以我想生成另一個名爲'偏移量'的列,例如校準值在每行的測量值與每個測量值的時間最接近。

因此,我像這樣的最終結果後:

In [14]: df 
Out[14]: 
          a   b   c offsets 
2013-02-27 18:10:00 -1.344753 0.438351 1.561849  10 
2013-02-27 18:11:00 1.715643 1.601984 -0.027408  10 
2013-02-27 18:12:00 -0.142264 -0.049462 0.482493  10 
2013-02-27 18:13:00 0.132617 0.737902 -0.347620  10 
2013-02-27 18:14:00 1.277257 0.083401 0.649422  10 
2013-02-27 18:15:00 0.048120 0.421220 0.149372  20 
2013-02-27 18:16:00 0.812317 -1.517389 2.035487  20 
2013-02-27 18:17:00 -0.058959 -0.034876 -1.535118  20 
2013-02-27 18:18:00 -0.666227 0.040208 -1.042464  20 
2013-02-27 18:19:00 -0.077031 -0.158351 -0.441992  20 
2013-02-27 18:20:00 0.103083 -0.129341 0.294073  30 
2013-02-27 18:21:00 0.900802 0.443271 -0.946229  30 
2013-02-27 18:22:00 0.744631 -0.058666 -0.386226  30 
2013-02-27 18:23:00 -0.064313 0.500321 -0.536237  30 
2013-02-27 18:24:00 -0.392653 0.789827 0.000109  30 
2013-02-27 18:25:00 1.926765 0.252259 -0.051475  40 
2013-02-27 18:26:00 -0.035577 0.559222 -0.290751  40 
2013-02-27 18:27:00 1.726165 0.626515 -0.868177  40 
2013-02-27 18:28:00 1.269409 1.520980 -0.181637  40 
2013-02-27 18:29:00 -1.151166 -0.300196 0.420747  40 

值的應用到通過.MAP等欄目,。適用等,我相信理解很好,這是顯然需要時間或抵消技巧需要做的分配的價值,我不知道什麼開始。

是否應該用pandas.DateOffsets攻擊?是否有機械來最大限度地減少熊貓內部的時間差異?

我很欣賞向正確的方向發展,並不一定要完整,只是我需要去的方向。

回答

3

我使用numpy的函數來計算最接近的時間定位:

from numpy.random import randn 
import numpy as np 
import pandas as pd 

index = pd.date_range(start="18:10",periods=20,freq='min') 
df = pd.DataFrame(randn(20,3),columns=list('abc'),index=index) 
calindex = pd.date_range("18:12:30",periods=4,freq='5min') 
caldata = pd.Series([10,20,30,40],index = calindex) 

# if you use numpy 1.7 
real_time = df.index.values 
cali_time = caldata.index.values 

# if you use numpy 1.6 
real_time = np.array(df.index.values.view("i8")/1000, dtype="datetime64[us]") 
cali_time = np.array(caldata.index.values.view("i8")/1000, dtype="datetime64[us]") 

right_index = cali_time.searchsorted(real_time, side="left") 
left_index = np.clip(right_index - 1, 0, len(caldata)-1) 
right_index = np.clip(right_index, 0, len(caldata)-1) 
left_time = cali_time[left_index] 
right_time = cali_time[right_index] 
left_diff = np.abs(left_time - real_time) 
right_diff = np.abs(right_time - real_time) 
caldata2 = caldata[np.where(left_diff < right_diff, left_time, right_time)] 
df["offset"] = caldata2.values 
+0

謝謝!但是:'l'和'r'是不確定的? – 2013-02-28 06:40:02

+0

我編輯了源代碼,我認爲這次沒問題。 – HYRY 2013-02-28 07:03:21

+0

我試圖使用它,但收到錯誤:left_diff和right_diff不能顯示在ipython控制檯中,我得到錯誤「TypeError:不知道如何將標量數字轉換爲int).np.where打破了錯誤「TypeError:ufunc'less'不支持輸入類型,並且輸入不能根據轉換規則'safe'安全地強制轉換爲任何支持的類型」 – 2013-02-28 07:07:22

相關問題