gpt4 book ai didi

python - 如何计算 MATLAB 中不包括周末的时间戳之间的营业时间?

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:23 26 4
gpt4 key购买 nike

我想知道是否有人知道如何在 MATLAB 中计算时间戳之间的营业时间或分钟数?假设我有两个时间戳:

started: 22/06/2017 18:00
ended: 26/06/2017 09:00

我想计算 08:0017:00 之间的分钟数,并排除周末。应该是 600 分钟。

有谁知道如何编写一个 MATLAB 函数来做到这一点?我还可以使用 python 和/或 R

新请求:
如果每个工作日的工作时间更改为 9:30-11:3013:00-15:00。不知道有没有人知道怎么做?

提前致谢!

更新:
@gnovice 我对您的原始代码进行了一些更改。它适用于使用两个独立的范围!想知道你对此有何感想?

function workMins = work_time(startTime, endTime)
dateBlock = repmat((dateshift(startTime, 'start', 'day'):...
dateshift(endTime, 'start', 'day')).', 1, 4); %'
dateBlock(:, 1) = dateBlock(:, 1)+hours(9)+minutes(30);
dateBlock(:, 2) = dateBlock(:, 2)+hours(11)+minutes(30);
dateBlock(:, 3) = dateBlock(:, 3)+hours(13)+minutes(00);
dateBlock(:, 4) = dateBlock(:, 4)+hours(15);
dateBlock(1, 1) = max(dateBlock(1, 1), startTime);
dateBlock(1, 3) = max(dateBlock(1, 3), startTime);
dateBlock(end, 2) = min(dateBlock(end, 2), endTime);
dateBlock(end, 4) = min(dateBlock(end, 4), endTime);
dateBlock((datestr(dateBlock(:, 1), 'd') == 'S'), :) = [];
workMins = max(diff(dateBlock, 1, 2), 0);
workMins(:,2) = [];
workMins = minutes(sum(workMins(:)));
end

最佳答案

MATLAB 解决方案并不像每个人想象的那样难看(尽管它可能可以使用 Financial Toolbox 进行简化)。切入正题,这里是接受两个 datetime 的函数的解决方案。值(value)观:

function workMins = work_time(startTime, endTime)
dateBlock = repmat((dateshift(startTime, 'start', 'day'):...
dateshift(endTime, 'start', 'day')).', 1, 2); %'
dateBlock(:, 1) = dateBlock(:, 1)+hours(8);
dateBlock(:, 2) = dateBlock(:, 2)+hours(17);
dateBlock(1, 1) = max(dateBlock(1, 1), startTime);
dateBlock(end, 2) = min(dateBlock(end, 2), endTime);
dateBlock((datestr(dateBlock(:, 1), 'd') == 'S'), :) = [];
workMins = minutes(sum(max(diff(dateBlock, 1, 2), 0)));
end

这就是它的工作原理...

首先,我们将开始和结束时间作为 datetime 值:

startTime = datetime('22/06/2017 18:00');
endTime = datetime('26/06/2017 09:00');

现在我们可以创建一个 N×2 日期时间矩阵。每行都是从 startTimeendTime 范围内的一天,现在时间设置为 0:00:00:

dateBlock = repmat((dateshift(startTime, 'start', 'day'):...
dateshift(endTime, 'start', 'day')).', 1, 2);

现在我们将第一列时间设置为 8:00:00,将第二列时间设置为 17:00:00:

dateBlock(:, 1) = dateBlock(:, 1)+hours(8);
dateBlock(:, 2) = dateBlock(:, 2)+hours(17);

现在我们添加 startTimeendTime 分别作为第一个和最后一个元素,将它们裁剪到 8:00:0017:00:00 时间范围:

dateBlock(1, 1) = max(dateBlock(1, 1), startTime);
dateBlock(end, 2) = min(dateBlock(end, 2), endTime);

接下来,我们删除带有 datestr 的行'S' 的日期值(即周末):

dateBlock((datestr(dateBlock(:, 1), 'd') == 'S'), :) = [];

最后,我们对列差进行求和(忽略负值),然后转换为分钟:

workMins = minutes(sum(max(diff(dateBlock, 1, 2), 0)));

我们得到了想要的结果:

workMins =

600

编辑:

关于新请求,您可以稍微更改函数以允许传入工作日的开始和结束时间,如下所示:

function workMins = work_time(startTime, endTime, workDayStart, workDayEnd)
dateBlock = repmat((dateshift(startTime, 'start', 'day'):...
dateshift(endTime, 'start', 'day')).', 1, 2); %'
dateBlock(:, 1) = dateBlock(:, 1)+hours(workDayStart);
dateBlock(:, 2) = dateBlock(:, 2)+hours(workDayEnd);
...

现在您可以使用单独的工作时间范围调用它并添加结果:

startTime = datetime('22/06/2017 18:00');
endTime = datetime('26/06/2017 09:00');
workTotal = work_time(startTime, endTime, 9.5, 11.5) ...
+ work_time(startTime, endTime, 13, 15);

或者从一个较大的范围中减去一个子范围:

workTotal = work_time(startTime, endTime, 9.5, 15) ...
- work_time(startTime, endTime, 11.5, 13);

如果您更愿意将工作日时间指定为字符数组,您可以像这样编写函数:

function workMins = work_time(startTime, endTime, workDayStart, workDayEnd)
dateBlock = repmat((dateshift(startTime, 'start', 'day'):...
dateshift(endTime, 'start', 'day')).', 1, 2); %'
workDayStart = datevec(workDayStart);
workDayEnd = datevec(workDayEnd);
dateBlock(:, 1) = dateBlock(:, 1)+duration(workDayStart(4:6));
dateBlock(:, 2) = dateBlock(:, 2)+duration(workDayEnd(4:6));
...

然后像这样使用它:

workTotal = work_time(startTime, endTime, '9:30', '11:30') ...
+ work_time(startTime, endTime, '13:00', '15:00');

关于python - 如何计算 MATLAB 中不包括周末的时间戳之间的营业时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44724156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com