我的时间向量包含以'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)
但是你没有告诉Matlab第二天是01:00,你不能指望它只是假设。实际上,您实际上使用的是日期字符串而不是时间字符串。无论出于何种原因,Matlab已经确定您的日期是2015年1月1日。看到这个尝试:
time = {'01:00:00';
'22:00:00'};
datestr(datenum(times));
我不知道它为什么选择了2015年1月1日,但它确实有意义的是它始终在两个时间选择相同的日期而不是以某种方式阅读你的想法并选择01:00作为第二天。
如果您想要做到正确,那么您还需要包含日期信息。选择任意日期作为基础:
time = {'02-Jan-2015 01:00:00';
'01-Jan-2015 22:00:00'}
现在你的代码应该给你你想要的时间:
datestr(mean(datenum(time)),'HH:MM:ss')
请注意,如果您想自动执行此操作,您可以假设在04: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')