How can I make a logical array by comparing two date vectors?
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Ekaterina Serikova
am 29 Apr. 2016
Bearbeitet: Stephen23
am 27 Aug. 2025
Hello, could you please help me on the following issue. I imported an Excel file containing the vector of dates (44 by 1, type - cell):
[temp, holidays]=xlsread('Holidays.xlsx', 'Tabelle1', 'A1:A44').
Then, I created the date vector with a step of 1 minute:
start_date = datenum('18-Apr-2015 16:30:00');
end_date = datenum('19-Apr-2015 10:00:00');
interval = 10/24/60;
date = datestr(start_date:interval:end_date);
My goal is to create a logical array that puts 1 if the date from the second (longer) vector equals the date in the first vector and 0 otherwise.
I tried the code below, but I have problems with data formats, which I cannot solve. Error using datenum (line 179) DATENUM failed.
Caused by: Error using dtstr2dtnummx Failed on converting date string to date number.
criteria=[];
for i=1:length(date)
if day(holidays(i))==day(date(i)) && month(holidays(i))==month(date(i)) && year(holidays(i))==year(date(i))
criteria(i)=1
else
criteria(i)=0
end
end
Can please anyone help on that? Thanks a lot in advance!
2 Kommentare
Azzi Abdelmalek
am 29 Apr. 2016
You can make your question clear by posting a sample of your imported data.
Akzeptierte Antwort
Stephen23
am 29 Apr. 2016
Bearbeitet: Stephen23
am 29 Apr. 2016
You could use ismember with the 'rows' option. It only takes two steps
- convert all of the dates into datevectors (not datenumbers) using datevec.
- call ismember on the first three columns of those dates (or pick whatever units you want to compare).
The output will be your desired logical vector.
Here is a full working example:
% all dates:
beg_date = datenum('18-Apr-2015 16:30:00');
end_date = datenum('19-Apr-2015 10:00:00');
interval = 10/24/60;
dat_mat = datevec(beg_date:interval:end_date);
% fake data:
holidays = {'18-Apr-2015 16:50:00';'19-Apr-2015 09:50:00'};
hol_mat = datevec(holidays)
% number of columns of the datevectors to compare:
N = 5;
idx = ismember(dat_mat(:,1:N),hol_mat(:,1:N),'rows');
and the output is a logical vector, exactly as requested. For this example it is true here:
>> find(idx)
ans =
3
105
This method has the advantage that you can very simply change the units that are being compared (by changing N), without needing to change any format strings.
2 Kommentare
Ekaterina Serikova
am 29 Apr. 2016
Bearbeitet: Ekaterina Serikova
am 29 Apr. 2016
Stephen23
am 29 Apr. 2016
Bearbeitet: Stephen23
am 27 Aug. 2025
@Ekaterina Serikova: don't worry, this is not your fault! This is because lots of software uses the illogical mm/dd/yyyy as the default. Because most of the world generally uses sequences that progresses in order (dd/mm/yyyy or yyyy/mm/dd) you can imagine the confusion that this can cause!
The solution is simple: you should always specify the date format when converting the date:
vec = datevec(in_strings,'dd/mm/yyyy')
An even better solution is to always use an ISO 8601 date format for all date strings: these are always unambiguous and have the advantage that they sort simply into chronological order!
Weitere Antworten (1)
Azzi Abdelmalek
am 29 Apr. 2016
You can use the ismember function
3 Kommentare
Azzi Abdelmalek
am 29 Apr. 2016
[~,a]=xlsread('holidays.xlsx');
b={'03-Apr-2015 16:30:00','06-Apr-2015 16:30:00','07-Apr-2015 16:30:00','08-Apr-2015 16:30:00'},;
bb=datestr(b,'dd.mm.yyyy'),
out=ismember(a,bb)
Siehe auch
Kategorien
Mehr zu Dates and Time finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!