首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算某个时间间隔内落入特定时间段的小时数?

如何计算某个时间间隔内落入特定时间段的小时数?
EN

Stack Overflow用户
提问于 2019-08-15 18:16:30
回答 1查看 49关注 0票数 0

我们共享汽车,价格取决于时间段。所以我们有一个从7:00到20:00°的“白天价格”和一个从20:00到7:00°的“夜间价格”。当一个人用了几天的车,我想数一数白天--一个晚上--的总时数。因此,可以计算汽车的使用价格。

我需要两个额外的列,比如"daylight“和"night”。我正在寻找一种快速的方法来做到这一点,因为有一些百富通发送的共享。

输入:

代码语言:javascript
复制
id; begin; end
1; 2019-06-03 14:00; 2019-06-06 03:30

预期输出:

代码语言:javascript
复制
id; begin; end; daylight; night
1; 2019-06-03 14:00; 2019-06-06 03:30; 32; 29.5 
EN

回答 1

Stack Overflow用户

发布于 2019-08-15 19:15:40

对于正好在午夜开始和结束的日期,这很容易。粗略估计,每24小时有11小时的夜间时间和13小时的日光时间,因此将这两个日期相加,并分别乘以11和13。

对于剩余的记录,我们可以在两组中解构边缘情况:

  • 如果您的开始时间早于午夜,那么从开始到午夜的几个小时是黑夜和白天?
  • 如果您的结束时间晚于午夜,那么您从午夜开始经过了几个小时?

正如你可能已经猜到的,我们有3个部分需要简单地加在一起: 1)从开始时间到午夜,2)从开始后的午夜到开始前的午夜,以及3)从开始前的午夜到结束的小时。

对于1)和3),我选择将夜间时间分别划分为上午和下午。

添加更多要检查的案例,我们可以执行以下操作:

代码语言:javascript
复制
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

尝试摆弄pminpmax语句,看看它们是如何工作的。它们的使用与我们的直觉相反,而且比我的第一个方法begin_morning = ifelse(hours_into_begin_day < 7, hours_into_begin_day - 7, 0)更好用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57508159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档