user1912925
user1912925

Reputation: 781

Logically index Data based upon two date time arrays in matlab

I will jump straight into a minimal example as I find this difficult to put into words. I have the following example:

Data.Startdate=[datetime(2000,1,1,0,0,0) datetime(2000,1,2,0,0,0) datetime(2000,1,3,0,0,0) datetime(2000,1,4,0,0,0)];
Data.Enddate=[datetime(2000,1,1,24,0,0) datetime(2000,1,2,24,0,0) datetime(2000,1,3,24,0,0) datetime(2000,1,4,24,0,0)];
Data.Value=[0.5 0.1 0.2 0.4];
Event_start=[datetime(2000,1,1,12,20,0) datetime(2000,1,1,16,0,0) datetime(2000,1,4,8,0,0)];
Event_end=[datetime(2000,1,1,14,20,0) datetime(2000,1,1,23,0,0) datetime(2000,1,4,16,0,0)];

What I want to do is add a flag to the Data structure (say a 1) if any time between Data.Startdate and Data.Enddate falls between Event_start and Event_end. In the example above Data.Flag would have have the values 1 0 0 1 because from the Event_start and Event_end vectors you can see there are events on January 1st and January 4th. The idea is that I will use this flag to process the data further.

I am sure this is straightforward but would appreciate any help you can give.

Upvotes: 1

Views: 227

Answers (1)

Jonas
Jonas

Reputation: 74940

I would convert the dates to numbers using datenum, which then allows fairly convenient comparisons using bsxfun:

isStartBeforeEvent = bsxfun(@gt,datenum(Event_start)',datenum(Data.Startdate));
isEndAfterEvent = bsxfun(@lt,datenum(Event_end)',datenum(Data.Enddate));

flag = any(isStartBeforeEvent & isEndAfterEvent, 1)

Upvotes: 2

Related Questions