MATLAB Answers

aishah
0

How do I separate date and time of a raw date?

Asked by aishah
on 30 Mar 2018
Latest activity Commented on by Walter Roberson
on 24 Feb 2019
>> a = untitled.startDate(1:10)
a =
10×1 categorical array
2013-07-10 00:01:00.0
2013-07-17 00:01:00.0
2013-06-29 00:01:00.0
2013-07-17 00:01:00.0
2013-05-11 00:01:00.0
2013-05-31 00:01:00.0
2013-06-06 00:01:00.0
2013-08-31 00:01:00.0
2013-05-21 00:01:00.0
2013-08-06 00:01:00.0
>> a.Format = 'dd-MMM-yyyy'
Error using categorical/subsasgn (line 87)
Attempt to assign field of non-structure array.

  3 Comments

What data was used to create the categorical array? Was categorical() applied to datetime() values, or was it applied to a cell array of character vectors?
What I did was, I imported the data into a 'table'. And I convert the data to 'Categorical Array'.
The imported data type is 'datetime'.

Sign in to comment.

Tags

2 Answers

Answer by Ahmet Cecen on 30 Mar 2018
Edited by Ahmet Cecen on 30 Mar 2018
 Accepted Answer

arrayfun(@(x) strsplit(x,' '),string(a),'UniformOutput',false)
string(a) - this makes the data easily process-able, converts to a string array.
@(x) strsplit(x,' ') - this is a function that splits each string into parts whenever a space(' ') is located(which works for your case)
arrayfun - applies the above function to each "row" in the string array.

  7 Comments

Ah, here:
b = reshape([k{:}],2,length(a))'
Now:
b(:,1)
b(:,2)
b = reshape([k{:}],2,length(a))'
Undefined variable "k" or class "k".
celldisp(b)
b{1} =
"2013-07-10" "00:01:00.0"
b{2} =
"2013-07-17" "00:01:00.0"
b{3} =
"2013-06-29" "00:01:00.0"
b{4} =
"2013-07-17" "00:01:00.0"
b{5} =
"2013-05-11" "00:01:00.0"
b{6} =
"2013-05-31" "00:01:00.0"
b{7} =
"2013-06-06" "00:01:00.0"
b{8} =
"2013-08-31" "00:01:00.0"
b{9} =
"2013-05-21" "00:01:00.0"
b{10} =
"2013-08-06" "00:01:00.0"

Sign in to comment.


Answer by Peter Perkins
on 2 Apr 2018

Don't do any of that.
You've read the timestamps in as datetimes. Don't fight that. Assuming you have a table T:
T.StartTime = timeofday(T.StartDate);
T.StartDate = dateshift(T.StartDate,'start','day);

  6 Comments

Does it make sense to perform regression on a time of day? Do you not worry about differences in results if the time is represented as 100^2 * hour + 100 * minutes + seconds, compared to 60^2 * hour + 60 * minutes + seconds ? Do you not worry about differences in results if you represent date as 100^2 * month_number + 100 * day_number + two_digit_year, compared to 100^2 * two_digit_year + 100 * month_number + day_number, compared to year plus decimal fraction of a fixed-length year, compared to year plus decimal fraction of year taking into account leap year and leap seconds ?
I think you should reconsider doing regression on dates or times of day.
Perhaps it would make sense to instead calculate a duration in seconds relative to the earliest datetime ? Perhaps it would make sense to table2array(TheTable(:,3:end)) so you are not extracting the date or time information ?
I missteated my problem I think, I am doing regressions on the data that is collected on each of the specific days. Not on the dates or days themselves
Then you do not need to convert the dates + times or datetime objects to numeric. What you need to do is be able to group your data based upon date. You should have a look at splitapply() -- or convert the table to a timetable() object and use retime()

Sign in to comment.