【问题标题】:How to calculate business hours between two dates when business hours vary depending on the day in R?当营业时间因R中的日期而异时,如何计算两个日期之间的营业时间?
【发布时间】:2020-11-18 04:24:21
【问题描述】:

我正在尝试计算两个日期之间的营业时间。营业时间因日期而异。

工作日有 15 个工作时间 (8:00-23:00),周六和周日有 12 个工作时间 (9:00-21:00)。

例如:开始日期07/24/2020 22:20(星期五)和结束日期07/25/2020 21:20(星期六),因为我只对营业时间感兴趣,所以结果应该是12.67hours。

这里是数据框和所需输出的示例:

start_date            end_date            business_hours
07/24/2020 22:20     07/25/2020 21:20        12.67
07/14/2020 21:00     07/16/2020 09:30        18.50
07/18/2020 08:26     07/19/2020 10:00        13.00
07/10/2020 08:00     07/13/2020 11:00        42.00

 

【问题讨论】:

  • @GordonShumway 它没有回答我的问题,因为我的营业时间因天而异。我认为这使得获得我需要的结果变得更加困难。
  • @Ben 没问题!非常感谢!
  • @ValeriaSalazar 请参阅使用mapply 编辑的答案以获取数据框示例。
  • @Ben 非常感谢!这就是我需要的!

标签: r date datetime


【解决方案1】:

您可以使用lubridate 尝试以下内容。我编辑了另一个我认为可能有用的函数。

首先在两个感兴趣的日期之间创建一个日期序列。然后根据营业时间创建间隔,检查每个日期是否在周末。

然后,使用pminpmax 将开始和结束时间“限制”到允许的营业时间间隔。

您可以使用time_length 获取间隔的时间测量;将它们相加将为您提供经过的总时间。

library(lubridate)
library(dplyr)

calc_bus_hours <- function(start, end) {
  my_dates <- seq.Date(as.Date(start), as.Date(end), by = "day")
  
  my_intervals <- if_else(weekdays(my_dates) %in% c("Saturday", "Sunday"),
    interval(ymd_hm(paste(my_dates, "09:00"), tz = "UTC"), ymd_hm(paste(my_dates, "21:00"), tz = "UTC")),
    interval(ymd_hm(paste(my_dates, "08:00"), tz = "UTC"), ymd_hm(paste(my_dates, "23:00"), tz = "UTC")))

  int_start(my_intervals[1]) <- pmax(pmin(start, int_end(my_intervals[1])), int_start(my_intervals[1]))
  int_end(my_intervals[length(my_intervals)]) <- pmax(pmin(end, int_end(my_intervals[length(my_intervals)])), int_start(my_intervals[length(my_intervals)]))
  
  sum(time_length(my_intervals, "hour"))
}

calc_bus_hours(as.POSIXct("07/24/2020 22:20", format = "%m/%d/%Y %H:%M", tz = "UTC"), as.POSIXct("07/25/2020 21:20", format = "%m/%d/%Y %H:%M", tz = "UTC"))
[1] 12.66667

编辑:对于西班牙语,使用c("sábado", "domingo") 而不是c("Saturday", "Sunday")

对于数据框示例,您可以使用mapply 来调用函数,使用两个选定的列作为参数。试试:

df$business_hours <- mapply(calc_bus_hours, df$start_date, df$end_date)

                start                 end business_hours
1 2020-07-24 22:20:00 2020-07-25 21:20:00       12.66667
2 2020-07-14 21:00:00 2020-07-16 09:30:00       18.50000
3 2020-07-18 08:26:00 2020-07-19 10:00:00       13.00000
4 2020-07-10 08:00:00 2020-07-13 11:00:00       42.00000

【讨论】:

  • 我得到的结果是 14 小时,而不是 13 小时。为什么会这样?结果应该是 12,67 小时
  • 09:00-21:20 周六。 7/25 是 12 小时 20 分钟,但是这 20 分钟不在工作时间,因为星期六的工作时间是 9:00-21:00,所以我只计算 12 小时,总共 12,67 小时。
  • 由于某种原因,我得到了 14 个结果,知道为什么吗? calc_bus_hours(as.POSIXct("07/24/2020 22:20", format = "%m/%d/%Y %H:%M", tz = "UTC"), as.POSIXct("07/25/2020 21:20", format = "%m/%d/%Y %H:%M", tz = "UTC")) [1] 14
  • 这是结果[1] 2020-07-24 22:20:00 UTC--2020-07-24 23:00:00 UTC 2020-07-25 08:00:00 UTC--2020-07-25 21:20:00 UTC [1] 14
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多