R 如何计算特定时间段内的时间间隔小时数?
我们共用汽车,价格取决于时间。所以我们有7:00到20:00的白天价格和20:00到7:00的夜间价格。当有人使用汽车几天时,我想计算白天的总小时数——一个晚上的时间。因此可以计算出汽车使用的价格 我需要有两个额外的栏目,如白天和夜晚。我正在寻找一个快速的方法来做到这一点,因为有一些百家股份 输入:R 如何计算特定时间段内的时间间隔小时数?,r,R,我们共用汽车,价格取决于时间。所以我们有7:00到20:00的白天价格和20:00到7:00的夜间价格。当有人使用汽车几天时,我想计算白天的总小时数——一个晚上的时间。因此可以计算出汽车使用的价格 我需要有两个额外的栏目,如白天和夜晚。我正在寻找一个快速的方法来做到这一点,因为有一些百家股份 输入: id; begin; end 1; 2019-06-03 14:00; 2019-06-06 03:30 预期产出: id; begin; end; daylight; night 1; 2019
id; begin; end
1; 2019-06-03 14:00; 2019-06-06 03:30
预期产出:
id; begin; end; daylight; night
1; 2019-06-03 14:00; 2019-06-06 03:30; 32; 29.5
对于精确在午夜开始和结束的日期,这很容易。粗略估计,每24小时一天有11小时的夜间和13小时的白天,因此将这两个日期分别乘以11和13 对于其余记录,我们可以将边缘情况分解为两组: 如果你在午夜之前出发,从出发到午夜的时间是多少小时是夜间和白天? 如果你比午夜晚结束,你从午夜开始经历了多少个小时? 正如你可能已经猜到的,我们有3个部分需要加在一起:1从开始时间到午夜,2从开始后的午夜到开始前的午夜,3从开始前的午夜到结束时间 对于1和3,我选择将夜间时间分别划分为上午和下午的时间 添加更多要检查的案例,我们可以执行以下操作:
library(dplyr)
library(lubridate)
df <- read.table(text='id; begin; end
1; 2019-06-03 14:00; 2019-06-06 03:30
2; 2019-06-03 22:00; 2019-06-06 14:00
3; 2019-06-03 02:00; 2019-06-06 22:30', sep=';', header=TRUE) %>%
mutate_at(vars(begin, end), as.POSIXct)
df %>% mutate(
begin_date = floor_date(begin, 'd'),
hours_into_begin_day = hour(begin) + minute(begin)/60,
begin_morning = pmax(0, pmin(7, 7-hours_into_begin_day)),
begin_daylight = pmax(0,pmin(13, 20 - hours_into_begin_day)),
begin_evening = pmin(24 - hours_into_begin_day , 4),
hours_into_end_day = hour(end) + minute(end)/60,
end_morning = pmin(7, hours_into_end_day),
end_daylight = pmax(0, pmin(13, hours_into_end_day-7)),
end_evening = pmax(0,hours_into_end_day-20),
days_between = floor_date(end, 'd') - ceiling_date(begin, 'd'),
daylight = as.integer(days_between) * 13 + begin_daylight + end_daylight,
night = as.integer(days_between) * 11 + begin_morning + begin_evening + end_morning + end_evening
)
# id begin end begin_date hours_into_begin_day begin_morning begin_daylight begin_evening hours_into_end_day end_morning end_daylight end_evening days_between daylight night
# 1 2019-06-03 14:00:00 2019-06-06 03:30:00 2019-06-03 14 0 6 4 3.5 3.5 0 0.0 2 days 32 29.5
# 2 2019-06-03 22:00:00 2019-06-06 14:00:00 2019-06-03 22 0 0 2 14.0 7.0 7 0.0 2 days 33 31.0
# 3 2019-06-03 02:00:00 2019-06-06 22:30:00 2019-06-03 2 5 13 4 22.5 7.0 13 2.5 2 days 52 40.5
尝试摆弄pmin和pmax语句,看看它们是如何工作的。它们的使用与我们的直觉相反,IMHO,并且比例如begin\u morning=ifelsehours\u进入\u begin\u day<7,hours\u进入\u begin\u day-7,0,这是我的第一个方法。使用floor\u datebegin'd'和天花\u datebegin'd'的注释非常有用,谢谢。我会尝试你的代码,并认为,这是好的。