2016-06-21 9 views
0

Ich habe einen Datensatz mit Daten auf 1 Spalte und Werte auf einer anderen SpalteWie teile ich einen Vektor von Daten in Tage auf?

'4/26/2016' 23 
'4/26/2016' 25 
'4/26/2016' 1 
'4/27/2016' 10 
'4/27/2016' 40 
'4/27/2016' 67 
'4/28/2016' 24 
'4/28/2016' 13 
'4/28/2016' 7 
'4/28/2016' 99 

Wie kann ich die Werte in verschiedenen Tagen trennen? z. B. 4/27/2016 wird Werte von 10, 40 und 67 und so weiter haben. Die Daten können je nach Datensatz, den ich verwende, unterschiedlich sein, so dass es keine festen Daten gibt. Vielen Dank!

+0

(1) Welche Datenstruktur und Datentypen verwenden Sie? Veröffentlichen Sie Ihre Daten als tatsächlichen MATLAB-Code (2) welche Ausgabe möchten Sie? Möchten Sie dieses Datum für jedes Datum auf einmal teilen oder nur ein Datum gleichzeitig eingeben? Wenn Sie beispielsweise eine Zellenfeldausgabe wünschen, oder werden Sie dies in einer Schleife tun? – Dan

+0

Ich möchte die Werte auf der Grundlage der Anzahl der Tage in verschiedene Vektoren auf einmal teilen. Wenn es also 5 Tage in der Datumsspalte gibt, werde ich 5 Vektoren von Werten haben, wobei sich jeder Vektor auf Werte von jedem Tag bezieht. – TYL

+0

Nein, das wollen Sie definitiv nicht, Sie wollen es in ein Zellenfeld mit 5 Elementen aufteilen. Gut, das ist einfach mit 'accumarray' (oder [' splitapply'] (http://www.mathworks.com/help/matlab/ref/splitapply.html) in der neuesten Version), aber wieder müssen Sie posten eine tatsächliche MATLAB-Datenstruktur, nicht nur einige Daten, die Sie eingegeben haben. – Dan

Antwort

2

Wir wissen nicht, welche Datenstruktur Sie so werden es verwenden wir einfach davon ausgehen müssen:

%% Your data 
dates = {'4/26/2016';'4/26/2016';'4/26/2016';'4/27/2016';... 
    '4/27/2016';'4/27/2016';'4/28/2016';'4/28/2016';... 
    '4/28/2016';'4/28/2016'}; 

values = [23; 25; 1; 10; 40; 67; 24; 13; 7; 99]; 

[uniqueDates,~,sub] = unique(dates) 
valuesPerDate = accumarray(sub, values, [], @(x){x}) 

%OPTIONAL 
combined = [uniqueDates, valuesPerDate] 

Ich würde Ihre Reisedaten in den neuen datetime Typen tatsächlich empfehlen erste Umwandlung, dh dates = datetime(dates) und dann später combined = [num2cell(uniqueDates), valuesPerDate], aber wenn nicht, dann verwenden Sie zumindest ein logischeres Format wie 'yyyy-mm-dd', so dass ihre alphabetische Reihenfolge die gleiche wie ihre chronologische Reihenfolge ist.

2
%% Your data 
date = {'4/26/2016';'4/26/2016';'4/26/2016';'4/27/2016';... 
    '4/27/2016';'4/27/2016';'4/28/2016';'4/28/2016';... 
    '4/28/2016';'4/28/2016'}; 

data = [23; 25; 1; 10; 40; 67; 24; 13; 7; 99]; 

%% First convert the date to datenum for ease 
date = datenum(date,'mm/dd/yyyy'); 

%% Get the number of days 
unique_days = unique(date); 

%% Loop through the different days and extract corresponding data 
%% - You might want to add unique identifiers to the variable names 
for idx = 1:length(unique_days) 
curr_day = unique_days(idx); % Get current date 
idx_days = date == curr_day; % indices of data for current date 
data_results{idx} = data(idx_days); % results 
end 
+1

Dies ist eine großartige Antwort, aber man sollte vermeiden,' eval' zu verwenden, es ist eine sehr schlechte Programmierpraxis. Erstellen Sie stattdessen ein Array von Strukturen oder ein Zellenarray –

+0

Danke! Ich stimme dem zu und erklärte das in meinem Kommentar vor der Bewertung. – OsJoe

+1

Leider Leute kopieren-einfügen, ohne zu lesen, ermutige ich Sie, die Antwort zu etwas besser zu ändern! –

Verwandte Themen