2014-05-23 46 views
3

假設我有一個在這裏顯示的日期向量tt和相應的aa對應的數據序列。例如:在時間序列中找到幾年之中的獨特時間

dd = datestr(datenum('2007-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:... 
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM'),... 
    'yyyy-mm-dd HH:MM'); 
tt = datevec(datenum(dd,'yyyy-mm-dd HH:MM')); 
tt(1002,:) = []; 
aa = rand(length(tt),1) 

如何確保這些年份中的小時和天數一致?

例如,我只想保留幾年內相同的時間,例如

2009-01-01 01:00 

將是相同

2010-01-01 01:00 

廣告等。

如果一個人一年有一個測量在

2009-01-01 02:00 

但YYYY-01-01 02:00

沒有出現在其他年份,此時應重新取出。

我想返回tt和aa,只保留那些年份一致的時間。如何才能做到這一點?

我正在考慮先查找指數的獨特年:

[~,~,iyears] = unique(tt(:,1),'rows'); 

,然後找到獨特的一個月指數,日和小時爲:

[~,~,iid] = unique(tt(:,2:4),'rows'); 

但我不知道如何組合這些以獲得所需的輸出?

+1

「一致」是什麼意思?你想檢查你的datevector是否有序,並且沒有遺漏點嗎? –

+0

通過一致我的意思是有相同的mm-dd HH:MM年間。我已經改變了OP來證明這一點。 – KatyB

+0

@Kate好奇,如果任何在這裏提供的答案適合你。 – Divakar

回答

0

下面的解決方案使用循環將數據存儲在單位數組中,這可能效率很低,但除非您的數據集很大(有很多年),否則它應該完成這項工作。總體思路是將數據集分解成幾年。我將得到的時間向量存儲在單元格數組中,因爲它們可能不會有相同的長度。然後我做一個所有時間向量的集合交集,以獲得一個共同時間的向量。從那裏直線前進。

years = unique(tt(:,1), 'rows'); 

% Put the "sub-times" of each year into cell array 
for ii = 1:length(years) 
    times_each_year{ii} = tt(tt(:,1)==years(ii),2:end); 
end 

% Do intersection of all "sub-times" sets 
common_times = times_each_year{1}; 
for ii = 2:length(years) 
    common_times = intersect(common_times, times_each_year{ii},'rows'); 
end 

% Find and delete the points that are not member of the "sub-times": 
idx = ~ismember(tt(:,2:end),common_times,'rows'); 
deleted_points = datestr(tt(idx,:)); % for later review 
tt(idx,:) = []; 

但是,請注意,deleted_points矢量包含的點數超出了人們的預期。那是因爲2008年是一個閏年,所有的點都對應於Febr。第29名被刪除。

如果您的數據被夏時制「污染」,另一個這樣的怪異可能會等待您。

0

代碼

a1 = str2num(datestr(tt,'mmddHHMM')); %// If in your data minutes are always 00, you can use 'mmddHH' instead and save some runtime 
k1 = unique(a1); 
gt1 = histc(a1,k1); 
valid_rows = ismember(a1,k1(gt1==max(gt1))); 
new_tt = tt(valid_rows,:); %// Desired tt output 
new_aa = aa(valid_rows,:); %// Desired aa output 

說明

要了解它是如何工作的,讓我們測試出的代碼在微觀層面。讓我們假設對應於tt一些小的數據 -

data1 = [4 5 1 4 5 1 4 5 6] 

data1是收集了幾組數據,類似於tt當這四個參數團聚成一個擁有超過數年,月,日,小時,分鐘數據單參數。

可以注意到它代表三套/年的數據,數據爲{4,5},{1,4,5}{1,4,5,6}。我們的工作是找出在所有三年/每組數據中重複的data1中的所有值。因此,最終輸出必須是{4,5}

讓我們來看看如何編碼。

步驟1:獲取唯一值

unique_val = unique(data1) 

我們會 - [1 4 5 6]

第2步:獲取唯一值的計數數據

count_unique_val = histc(data1,unique_val) 

輸出是 - [2 3 3 1]

第3步:從唯一值數組中獲取其計數等於計數最大值的索引,指示這些是在所有集合中重複的唯一值。

index1 = count_unique_val==max(count_unique_val) 

輸出出來的 - [0 1 1 0]

第4步:獲取這些 「一致」 的獨特價值

consistent_val = unique_val(index1) 

給我們 - [4 5],這正是我們所期待的。

步驟5:最後得到的指數,其中所述一致的數據存在時, 可以以後用於選擇與「一致」的數據的行。

index_consistent_val = ismember(data1,consistent_val) 

輸出是 - [1 1 0 1 1 0 1 1 0],這也有道理。

請注意,在原始代碼a1 = str2num(datestr(tt,'mmddHHMM'));中,我們可以獲得月份,日期,小時和分鐘四個參數中的單個參數,如前面的評論中所述。

相關問題