【问题标题】:Finding set range/ intervals given start&end times (data.table package)查找给定开始和结束时间的设定范围/间隔(data.table 包)
【发布时间】:2018-06-29 07:27:26
【问题描述】:

我正在尝试为给定开始和结束时间的每个数据行创建时间间隔。例如,给定开始/结束时间,我想创建显示在另一列 [右列] 中的相应时间范围,称为“时间范围”。目标是将一天分为 (0-6:00,6-12:00,12-18:00,18-24:00) 的季度。

Person        Start Time            End Time            Time range
A             4/22/2018 8:58        4/22/2018 9:07      6:00-11:59 
B             4/19/2018 6:14        4/19/2018 6:20      6:00-11:59
C             4/18/2018 21:41       4/18/2018 22:03     18:00-23:59            

我正在使用"data.table" package 并使用file1 <- fread("Data.csv",sep = ",") 上传csv 文件,因为文件可能非常大,而且我听说最好使用data.table 来加快计算速度;但是,我无法剥离开始时间和结束时间来创建时间范围。为此,只有开始时间很重要。谢谢

【问题讨论】:

  • 请不要使用 RStudio 标签,除非您对 rstudio 有特别的疑问。
  • 当区间扩展到多个范围时会发生什么?例如。间隔4/18/2018 21:41 - 4/19/2018 04:49
  • 为了获得好的答案,您可以执行以下操作:将 data.table 的前三行保存在单独的对象 x 中,选择 x 的相关列,然后发布 dput( x)。
  • 为了这个目的,只有开始时间很重要

标签: r


【解决方案1】:

我不知道您的日期格式,所以我将其创建为 POSIXct。这是一个基本的 R 解决方案,而不是 data.table

# sample data
df <- data.frame(Person = LETTERS[1:5], 
            start_time = as.POSIXct(c("4/22/2018 8:58", "4/19/2018 6:14", 
                         "4/18/2018 21:41", '5/17/2018 00:00', '7/17/2018 17:59'), 
                                    format = '%m/%d/%Y %H:%M'))

# extract hour from start_time and identify corresponding interval by dividing by 6
interval_id <- as.numeric(format(df$start_time, "%H")) %/% 6

# prepare and add time ranges
df$range <- c("00:00-05:59", "06:00-11:59", '12:00-17:59', '18:00-23-59')[interval_id+1]

#  Person          start_time       range
#1      A 2018-04-22 08:58:00 06:00-11:59
#2      B 2018-04-19 06:14:00 06:00-11:59
#3      C 2018-04-18 21:41:00 18:00-23-59
#4      D 2018-05-17 00:00:00 00:00-05:59
#5      E 2018-07-17 17:59:00 12:00-17:59

【讨论】:

    【解决方案2】:

    我建议您使用 data.table 导入 csv,然后使用包 lubridate 进行日期/时间操作。可能您还应该声明您的列的日期变量为yourdf$Start_Time&lt;-as.Date(x,...)。 如果您仍有问题,请告诉我如何为您提供帮助。

    【讨论】:

    • as.Date()可以用来剥离时间吗?我搜索,它说它只适用于日期。如果是这样,我应该怎么做是最优化的,因为在给定非常大的数据集的情况下,代码应该运行得非常快。
    • 试试这样require(lubridate) var1 &lt;- mdy_hms("07-24-2017 09:55:26")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多