计算时间字符串的平均值
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')
我有一个包含时间的时间向量 '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')