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



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

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'

相关内容

最新更新