2016-01-12 139 views
1

同步具有不同的時間戳的時間序列,以用戶定義的間隔與分配的值假定以下時間序列(TS):平均和在MATLAB

time val 
15:00 4 
15:45 7 
17:12 2.3 
17:50 2.9 

從時間戳,每個值都是有效的,直到下一個出現。因此,從15:00到15:45的值是4或從15:45到17:12是2.3。這些時間戳之間的每個新數據點應具有相同的值。我想要的是一個新的ts,具有恆定的時間間隔和預定義的起始點。假設起點爲15:00,間隔應爲30分鐘。通常情況下,我可以使用同步函數 - 但是,函數使用插值方法,這不是我在這裏需要的,因爲數據點之間的值不應該被內插,但是如果時間戳重疊,則應該取平均值。

新的TS應該是這樣的:

time val 
15:00 4 
15:30 5.5 
16:00 7 
16:30 7 
17:00 4.18 

的值在時刻15:30被計算爲=(4 * 15 + 7 * 15)/ 30,等等。我已經實現了一個代碼,可以通過將trapz函數與if語句結合使用來解決這個問題。但是,我想知道是否有更好/更簡單的解決方案,作爲修改的同步功能,因爲我有超過500.000個數據點。

在此先感謝

+0

當你做平均值時,它與做插值(它的實際線性插值)幾乎相同。你的平均16:00和16:30都是7,這是如何工作的? – GameOfThrows

+0

是正確的,但不適用於時間戳內的其他時間戳(例如源自15:45時間戳的新時間戳16:00)。 16:00的價格從16:00至16:30有效,16:30的有效期至17:00有效。從原始數據集中獲得的值爲7(從15:45時間戳到有效時間爲17:12) – Jonas

+0

我認爲在這種情況下,您希望在插值之前舍入到最近的時間戳。 – GameOfThrows

回答

1

我設法通過把所有的時間步入分鐘值,之後將梯形規則來獲得曲線(AUC)下面積的總和,以解決我的問題,然後平均通過除以應用的分鐘間隔。

AllValues = interp1(Time,Data,NewTime,'previous')'; 
    [Xdata,Ydata] = stairs(NewTime,AllValues); 
    NewTS = timeseries(Xdata,Ydata); 
    TrapzSum = cumtrapz(NewTS.time,NewTS.data); 
    TrapzSum = TrapzSum(1:2:end); 
    NewResults = diff(TrapzSum(IndicesOfNewInterval))/MinInt; 
+0

感謝您提出編輯我的答案:http://stackoverflow.com/review/suggested-edits/10892141 - 你的編輯是正確的,但它被拒絕的原因(我沒有拒絕)是因爲你的評論聽起來像是你不必要地編輯它。在您對變更的評論中,您需要更加明確。 **將**指向文檔並解釋**爲什麼**您必須將其從0.90更改爲90以及0.99更改爲99 ...因爲這就是**所假設的**而不是我在過去:http://www.mathworks.com/help/stats/prctile.html。謝謝你的方式! – rayryeng

+0

酷!感謝您指出它,我會記住下次,我認爲答案的OP必須接受/拒絕它。其實,我第一次試圖評論你的答案,所以你可以做出改變(但我沒有被允許,因爲我的低stackoverflow狀態)。相反,我被允許提出對答案的編輯... – Jonas

+0

編輯轉到審閱隊列,Stack Overflow用戶查看您所做的編輯以確定編輯的合法性。 http://stackoverflow.com/review/suggested-edits/10892141 - 你對編輯的評論還不夠清楚,爲什麼編輯被批准,這就是爲什麼它被拒絕。無論如何,你是一個相對較新的用戶,所以你一定會獲得足夠的聲望來最終發表評論:)歡迎並再次感謝編輯。即使您的修改被拒絕,我也自己做了更改。 – rayryeng