R计算午夜后的小时数

gj3fmq9x  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(135)

我想用R来计算R中两个军用时间(例如,13:00和7:00)之间的时差。假设我有以下数据表:
| ID| start.time | end.time |
| --|--|--|
| 1 |18点整|两点|
| 2 |18点整|20点整|
| 3 |两点|四点|
我想计算start.time和end. time之间的时间差。我希望我的结果如下:
| ID| start.time | end.time |diff|
| --|--|--|--|
| 1 |18点整|两点| 8 |
| 2 |18点整|20点整| 2 |
| 3 |两点|四点| 2 |

**as.POSIXct() & difftime()**我尝试过使用as.posixct(start.time, format = '%H:%M')as.POSIXct(end.time, format = '%H:%M')将start.time和end.time转换为datetime类,并使用difftime()查找它们之间的时间差。这只适用于2和3。对于第一个,as.POSIXct()参数将所有时间转换为相同的日期,因此它们之间的差值不等于8。

  • 我的问题是:是否有一个代码可以考虑所有这些场景?*
ih99xse1

ih99xse11#

你可以先将你的小时数转换成R POSIXct对象,然后如果end.time早于start.time,则给end.time加上一天。最后使用difftime计算它们的小时数差,并删除任何不需要的列(最后一个select函数)。

library(dplyr)

df %>% mutate(across(ends_with("time"), ~as.POSIXct(.x, format = '%H:%M'), .names = "{.col}2"),
              end.time2 = if_else(end.time2 < start.time2, end.time2 + 1*60*60*24, end.time2),
              difftime = difftime(end.time2, start.time2)) %>% 
  select(-ends_with("2"))

  id start.time end.time difftime
1  1      18:00     2:00  8 hours
2  2      18:00    20:00  2 hours
3  3       2:00     4:00  2 hours

字符串

xcitsw88

xcitsw882#

下面的代码将实现您正在寻找的功能,尽管它可能很难泛化。

data<-data.frame(
  id=c(1,2,3),
  start.time=c("18:00","18:00","2:00"),
  end.time=c("2:00","20:00","4:00")
)
library(tidyverse)
data<-mutate(data,
             start.time=as.numeric(gsub("\\:.*","",start.time)),
             end.time=as.numeric(gsub("\\:.*","",end.time)),
             diff=ifelse(end.time>start.time,end.time-start.time,
                         (24-start.time)+end.time))

字符串
如果end.time较大,则只需从start.time中减去end.time。如果start.time较大,则先从24中减去start.time,然后加上end.time。这取决于分钟是否无关紧要,因为我使用gsub()删除了:之后的所有内容。

dnph8jn4

dnph8jn43#

您可以将24*60^2秒(一天)添加到行差小于零的日期时间。由于结果将是秒,因此我们将其除以60^2matrixStats::rowDiffs在这里将是 lightning 般的快。

> transform(dat, 
+           diff=sapply(dat[2:3], as.POSIXct, format='%H:%M') |>
+             {\(.) {
+               nw_dy <- matrixStats::rowDiffs(.) < 0
+               .[nw_dy, 2] <- .[nw_dy, 2] + 24*60^2
+               unname(.)
+             }}() |>
+             matrixStats::rowDiffs()/60^2)
  id start.time end.time diff
1  1      18:00     2:00    8
2  2      18:00    20:00    2
3  3       2:00     4:00    2

字符串
如果没有 matrixStats,你可以做以下事情,当然,这会更慢:

> transform(dat, 
+           diff=sapply(dat[2:3], as.POSIXct, format='%H:%M') |>
+             {\(.) {
+               nw_dy <- .[, 'end.time'] - .[, 'start.time'] < 0
+               .[nw_dy, 2] <- .[nw_dy, 2] + 24*60^2
+               unname(.)
+             }}() |>
+             apply(1, diff)/60^2)
  id start.time end.time diff
1  1      18:00     2:00    8
2  2      18:00    20:00    2
3  3       2:00     4:00    2

  • 数据:*
> dput(dat)
structure(list(id = 1:3, start.time = c("18:00", "18:00", "2:00"
), end.time = c("2:00", "20:00", "4:00")), class = "data.frame", row.names = c(NA, 
-3L))

相关问题