2015-07-24 7 views
1

У меня есть вектор, содержащий время времени, выраженное в 'dd/mm/yyy HH:MM:ss'вычислить среднее значение времени строки

time = { '09/01/2012 23:57:00'; 
'11/01/2012 01:36:00'; 
'12/01/2012 00:48:00'; 
'13/01/2012 00:35:00';} 

, представляющее время, в которое я лечь спать.

Я хотел бы вычислить среднее из элементов в векторе времени, чтобы узнать, во сколько я ложился спать в среднем.

Если я бег

datestr(mean(datenum(time,'dd/mm/yyyy HH:MM:ss')),'HH:MM:ss') 

Я получаю

ans = 

12:44:00 

, что неправильно (для моей цели, не matematically), так как Matlab делает некоторый беспорядок между первым и вторым днем ​​... на самом деле они не являются последовательными, как другие.

Как это исправить?

+0

Неверно? 1:00:00 + 22:00:00 = 23:00:00 и разделите это на 2, вы получите 11:30:00. – aconkey

+1

Также я думаю, что ваш вектор 'time' и векторное имя' test', используемые в 'datestr', не соответствуют – aconkey

+0

Привет, спасибо за ваш комментарий. среднее между 01:00 и 22:00 должно быть 23:30 вечера ... не так ли? – gabboshow

ответ

1

Но вы не сказали Matlab, что на следующий день 01:00, вы не можете ожидать, что он просто предположит это. Фактически вы фактически используете строки даты, а не строки времени. Matlab, по какой-то причине, решил, что ваши даты на 1 января 2015 г. Для того, чтобы увидеть эту попытку:

time = {'01:00:00'; 
     '22:00:00'}; 
datestr(datenum(times)); 

Я не знаю, почему он выбрал 1го января 2015 года, но это имеет смысл что он последовательно выбирал ту же дату для обоих времен, а не как-то читал ваш разум и выбирал 01:00 на следующий день.

Если вы хотите это исправить, вам также необходимо указать информацию о дате. Комплектование любой произвольной даты в качестве основы:

time = {'02-Jan-2015 01:00:00'; 
     '01-Jan-2015 22:00:00'} 

Теперь ваш код должен дать вам время вы хотели:

datestr(mean(datenum(time)),'HH:MM:ss') 

Примечание, если вы хотите автоматизировать этот процесс, можно сказать, предположить, что любой раз, прежде чем скажем 4:00 это на следующий день, а затем просто добавить один день к тем элементам (после datenum конечно)


на основе вашего редактирования:

time = {'09/01/2012 23:57:00'; 
     '11/01/2012 01:36:00'; 
     '12/01/2012 00:48:00'; 
     '13/01/2012 00:35:00';} 

hours = str2num(datestr(time, 'HH')); %// Extract just the hour from the datetime 
t = datenum(datestr(time, 'HH:MM:ss')); %// Extract just the time (i.e. make everything on the same day 
t = t+(hours<5); %// Add one day to everything after midnight. 5 is an assumption, you can tweak this cut-off time. 
datestr(mean(t),'HH:MM:ss') 

ans = 

00:44:00 

Кстати, вы можете проверить новый тип данных datetime. Я еще не использовал его сам, но как пример, получить час тайм-аута было бы намного проще (ну, менее хаки), и я уверен, что есть и другие преимущества. Вот моя попытка:

dates = datetime(time); %// using your time cell array of strings still 
%// Now we must make them all the same arbitrary day: 
dates.Day = 1; 
dates.Year = 2015; %// or 0 or datetime('today').Year 
dates.Month = 1; 
%// Now we add days to those after midnight the same as before 
dates.Day = dates.Day + (dates.Hour < 5); 
mean(dates) %// Or datestr(mean(dates),'HH:MM:ss') 
+0

Привет, Дэн, спасибо за ваш ответ ... Я обновил свой вопрос ... У меня есть дата, но, как вы можете видеть из моего отредактированного вопроса, это не помогает. – gabboshow

+0

@gabboshow вам нужно выбрать базовая дата, все до полуночи получает ту же дату, что и после даты следующего дня. – Dan

+0

@gabboshow см. Мое редактирование – Dan

Смежные вопросы