使用datenum()检查给定的日期时间是否在预定义的时间间隔内

时间:2014-12-07 20:13:11

标签: matlab datetime vector numbers

我有一个包含日期(和其他内容)的表格,我从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 ,其余部分对我来说并不是那么明显。任何想法如何避免转换为其他日期格式只是为了这一步,同时避免一些复杂的公式提取所需的数据(不一定只有小时,但我也对其余的感兴趣)?

1 个答案:

答案 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'