计算时间字符串的平均值

calculate mean of time string

我有一个包含时间的时间向量 '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

这是错误的(为了我的目标,不是数学上的)因为 Matlab 在第一天和第二天之间弄得一团糟……事实上它们不像其他的那样连续……

如何解决这个问题?

但是您没有告诉 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')