将开始时间和总持续时间转换为每小时经过的时间

奥列克桑德尔

我有关于开始时间(“ startTime”,日期时间变量,POSIXct)和持续时间(以分钟为单位)的数据(“ duration_minutes”):

df <- data.frame(id = c(1, 2, 3),
                 startTime = as.POSIXct(c("2018-01-01 12:15:31",
                                          "2018-01-02 23:43:00",
                                          "2018-01-03 11:00:11")), 
                 duration_minutes = c(315, 120, 45))

我想将开始时间和持续时间转换为每小时从每小时开始时间到持续时间结束时的最后一个小时的每小时经过时间:

df_result <- data.frame(id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 3),
                        startTime = c("2018-01-01 12:15:31","2018-01-01 13:00:00",
                                "2018-01-01 14:00:00","2018-01-01 15:00:00",
                                "2018-01-01 16:00:00","2018-01-01 17:00:00",

                                "2018-01-02 23:43:00","2018-01-03 00:00:00",
                                "2018-01-03 01:00:00",

                                "2018-01-03 11:00:11"),
                        duration_minutes = c(44.48, 60, 60, 60, 60, 30.5, 17, 60, 43, 45))

请提供可能的解决方案的建议。

arg0naut91

尝试这个:

library(data.table)
library(lubridate)
library(magrittr)

df <-
  setDT(df)[, start_ceiling := ceiling_date(startTime, "hour", change_on_boundary = TRUE)] %>%
  .[, `:=` (
    reps = ifelse(
      startTime + (duration_minutes * 60) <= start_ceiling, 1, pmax(2, floor(duration_minutes / 60) + 1)
    ),
    initial_diff = as.numeric(difftime(start_ceiling[1], startTime[1], units = "mins"))
  ), by = id] %>%
  .[, df[df[, rep(.I, reps)]]] %>%
  .[, startTime := pmax(startTime, floor_date(startTime, "hour") + hours(0:(.N - 1))), by = id] %>%
  .[reps > 1, duration_minutes := c(initial_diff[.N], 
                                    rep(60, reps[.N] - 2),
                                    (duration_minutes[.N] - initial_diff[.N]) %% 60), by = id] %>%
  .[!(duration_minutes == 0 & reps > 1), ] %>%
  .[, c("reps", "start_ceiling", "initial_diff") := NULL]

我已经用我们到目前为止收集的所有场景对它进行了测试,这是输出:

    id           startTime duration_minutes
 1:  1 2018-01-01 12:15:31         44.48333
 2:  1 2018-01-01 13:00:00         60.00000
 3:  1 2018-01-01 14:00:00         60.00000
 4:  1 2018-01-01 15:00:00         60.00000
 5:  1 2018-01-01 16:00:00         60.00000
 6:  1 2018-01-01 17:00:00         30.51667
 7:  2 2018-01-02 23:43:00         17.00000
 8:  2 2018-01-03 00:00:00         60.00000
 9:  2 2018-01-03 01:00:00         43.00000
10:  3 2018-01-03 11:00:11         45.00000
11:  4 2018-01-04 10:00:00         60.00000
12:  4 2018-01-04 11:00:00          5.00000
13:  5 2018-01-05 00:00:00         60.00000
14:  6 2018-01-06 11:35:00         25.00000
15:  6 2018-01-06 12:00:00         10.00000
16:  7 2018-01-07 00:00:00         60.00000
17:  7 2018-01-07 01:00:00         60.00000

使用的数据:

df <- data.frame(
  id = c(1, 2, 3, 4, 5, 6, 7),
  startTime = as.POSIXct(
    c(
      "2018-01-01 12:15:31",
      "2018-01-02 23:43:00",
      "2018-01-03 11:00:11",
      "2018-01-04 10:00:00",
      "2018-01-05 00:00:00",
      "2018-01-06 11:35:00",
      "2018-01-07 00:00:00"
    )
  ),
  duration_minutes = c(315, 120, 45, 65, 60, 35, 120)
)

df

  id           startTime duration_minutes
1  1 2018-01-01 12:15:31              315
2  2 2018-01-02 23:43:00              120
3  3 2018-01-03 11:00:11               45
4  4 2018-01-04 10:00:00               65
5  5 2018-01-05 00:00:00               60
6  6 2018-01-06 11:35:00               35
7  7 2018-01-07 00:00:00              120

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将“持续时间”“单位”转换为毫秒

如何获得一系列带有开始时间,结束时间和持续时间的时间?

将秒和持续时间转换为SRT(字幕)时间格式(PHP)

将毫秒转换为ISO 8601持续时间

在Excel中创建带有开始时间和持续时间的条形图

R:如何根据不同的开始时间将经过的秒数转换为一天中的时间

如何计算事件总持续时间的经过时间?

将活动数据分为几个小时,并获取每小时的持续时间

使用Java将时间和当前时刻之间的经过时间转换为ISO 8601持续时间

使用熊猫从开始时间和持续时间(分钟)计算结束时间。标准方法错误

将开始时间和结束时间转换为小时记录的查询

熊猫-将事件持续时间的每小时转换为单独的一行

按小时的开始和结束时间戳记定义持续时间

将时间转换为持续时间

将持续时间(秒)转换为小时和分钟,并跳过空值

Python:将Unix时间转换为持续时间

如何从文本框中指定的开始时间和结束时间计算持续时间?

具有开始时间和结束时间的SQL事件,转换为小时数

在开始时间和结束时间之间每小时计数

命令完成后的持续时间、开始时间和结束时间

给定开始时间和持续时间,显示每分钟自开始以来的持续时间

SQL 计算查询开始时间和持续时间以查找结束时间

如何将日期时间序列转换为以小时为单位的实际持续时间?

React MomentJS 从开始时间和结束时间获取持续时间

在 C++ 中使用开始时间和持续时间计算活动任务

将日历持续时间转换为持续时间

将行程持续时间转换为停车持续时间

将持续时间转换为总毫秒数

如何从持续时间计算时间上连续分组事件的开始时间和结束时间