How can I make a logical array by comparing two date vectors?
4 次查看(过去 30 天)
显示 更早的评论
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 个评论
Azzi Abdelmalek
2016-4-29
You can make your question clear by posting a sample of your imported data.
采纳的回答
Stephen23
2016-4-29
编辑:Stephen23
2016-4-29
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 个评论
Stephen23
2016-4-29
编辑:Stephen23
2016-4-29
@Ekaterina Serikova: don't worry, this is not your fault! This is because in the USA we use a an illogical date format that no one else in the world uses: mm/dd/yyyy. And lots of US software uses this as the default. Because the rest of the word generally use a sequence 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!
更多回答(1 个)
Azzi Abdelmalek
2016-4-29
You can use the ismember function
3 个评论
Azzi Abdelmalek
2016-4-29
[~,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)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Time Series Objects 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!