我有一个包含日期(和其他内容)的表格,我从CSV文件中提取了该表格。为了对我的数据进行一些处理(包括绘图),我决定将我的所有日期字符串转换为日期数字(下面为了简单起见,我将排除所有其他数据并仅关注日期,所以不要注意从日期到时间表的步骤以及可以省略的事实):
dates = [7.330249777777778e+05;7.330249291666667e+05;7.330246729166667;7.330245256944444;7.330246763888889;7.330245284722222;7.330245326388889;7.330246625000000];
timetable = table(dates);
timetable
_________
7.330249777777778e+05
7.330249291666667e+05
7.330246729166667
7.330245256944444
7.330246763888889
7.330245284722222
7.330245326388889
7.330246625000000
我面临以下问题 - 根据白天的时间我想告诉用户日期是早上(24小时制:5-12小时),中午(12-13小时),下午(13-18h),晚上(18-21h),晚上(21-5h)根据我存储在桌子上的日期。如果我有一个日期向量(包含元素:年,月,日,小时,分钟,秒),那将非常简单:
for date = 1:size(timetable)
switch timetable(date).hour
case {5,12}
'morning'
case {12,13}
'noon'
case {13,18}
'afternoon'
case {18,21}
'evening'
otherwise
'night'
end
end
使用 7.330246729166667 ,其余部分对我来说并不是那么明显。任何想法如何避免转换为其他日期格式只是为了这一步,同时避免一些复杂的公式提取所需的数据(不一定只有小时,但我也对其余的感兴趣)?
答案 0 :(得分:1)
Matlab序列日期中的一个单位相当于1天,即24小时。知道了这一点,您可以在您定义的日内桶中加入日期的小数部分(请注意,您的switch
仅适用于完全等于案例列表的值):
bins = {'morning', 'noon', 'afternoon', 'evening', 'night'};
edges = [5,12,13,18,21,25]./24; % As fraction of a day
% Take fractional part
time = mod(dates,1);
% Bin with lb <= x < ub, where e.g. lb = 5/25 and is ub = 12/24
[counts,~,pos] = histcounts(time, edges);
% Make sure unbinned x in [0,5) are assigned 'night'
pos(pos==0) = 5;
bins(pos)'
ans =
'night'
'night'
'morning'
'morning'
'morning'
'morning'
'morning'
'morning'