计算小时之间的差异,不考虑日期

时间:2018-12-17 15:22:21

标签: r datetime

我有一个带有时间戳的向量,格式为:

"12:00:00"

它是24小时格式,我没有与这些时间戳相关的日期。我想计算两者之间的时差。

为使1211 = 1之间的差异, 以及2301 = 2之间的区别。

我想计算向量中的时间到给定时间的差,以便获得具有时间差的向量。

数据:

head(x3)
[1] "12:00:00" "18:00:00" "21:00:00" "06:00:00" "00:00:00" "09:00:00"

如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

如果您只对小时的绝对差值感兴趣并且时间戳格式一致,则可以这样做

absDif <- abs(as.numeric(substr(test_time[2], 1, 2)) - as.numeric(substr(test_time[1], 1, 2)))

如果您还需要分钟,则首先生成数字时间列可能更方便,例如就像在循环中

numericTimestamps[i] <- as.numeric(substr(test_time[i], 1, 2) + 
       as.numeric(substr(test_time[i], 4, 5) / 60 + 
       as.numeric(substr(test_time[i], 7, 8) / 60 / 60

编辑以说明修改后的问题:

如果我说对了,您不是在寻找绝对的差异,而是在考虑换班的小时数上的简单差异。在这种情况下,如下所示建议使用dateTime对象可能会更直接。如果您想使用数字,则需要自己计算日期偏移,例如通过添加if条件:

absDif <- as.numeric(substr(test_time[2], 1, 2)) - as.numeric(substr(test_time[1], 1, 2))

# if the first is smaller than the second, there was most probably a shift in date
if(as.numeric(substr(test_time[2], 1, 2)) < as.numeric(substr(test_time[1], 1, 2))){

  # correct by 24 hours
  absDif <- as.numeric(substr(test_time[2], 1, 2)) - (as.numeric(substr(test_time[1], 1, 2)) + 24)
}

答案 1 :(得分:2)

我们认为

  1. 输入内容为hh:mm:ss格式的字符串,其中hh在00到23之间(含0和23)
  2. 仅应使用hh
  3. 输出应为小时数
  4. 从第一个小时减去第二个小时
  5. 如果前几个小时少于第二个,则在#4上加24

上面为问题中的两个示例提供了以下内容。不使用任何软件包。

Diff <- function(t1, t2) {
  h1 <- as.numeric(sub(":.*", "", t1))
  h2 <- as.numeric(sub(":.*", "", t2))
  h1 - h2 + 24 * (h1 < h2)
}

Diff("12:00:00", "11:00:00")
## [1] 1

Diff("1:00:00", "23:00:00")
## [1] 2

如果我们希望计算下面显示的v"12:00:00"之间的差异,请说:

v <- c("12:00:00", "18:00:00", "21:00:00", "06:00:00", "00:00:00", "09:00:00")
Diff(v, "12:00:00")
## [1]  0  6  9 18 12 21

答案 2 :(得分:1)

一个基本的R选项是通过附加一些任意日期来使用您的数据形成临时日期时间。然后,使用strptimedifftime查找小时数差异:

t1 <- "12:00:00"
t2 <- "10:15:00"
date <- "2018-01-01"

as.numeric(difftime(strptime(paste(date, t1), "%Y-%m-%d %H:%M:%S"),
                    strptime(paste(date, t2), "%Y-%m-%d %H:%M:%S")))

[1] 1.75

答案 3 :(得分:0)

这是使用lubridatedplyr

的方法
library(dplyr)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

times <- data_frame(times = hms(c("12:00:00", "18:00:00", "21:00:00", "06:00:00", "00:00:00", "09:00:00")))

times %>% 
  mutate(difference =  hour(times) - lag(hour(times)))
#> # A tibble: 6 x 2
#>   times        difference
#>   <S4: Period>      <dbl>
#> 1 12H 0M 0S            NA
#> 2 18H 0M 0S             6
#> 3 21H 0M 0S             3
#> 4 6H 0M 0S            -15
#> 5 0S                   -6
#> 6 9H 0M 0S              9

reprex package(v0.2.1)于2018-12-17创建