Home > Enterprise >  Subtracting time duration from a timestamp in R
Subtracting time duration from a timestamp in R

Time:10-04

I have a data frame as follows with a Session end time (%D/%M/%Y %H:%M:%S) and Session Duration (%M:%S). I want to obtain the Session start time in the format %D/%M/%Y %H:%M, by subtracting the Session Duration from the Session End time and attaching it to the data frame as a separate column called "SessionEnd". How am I supposed to do this in R?

SessionEnd <- c("22/06/2022 0:01:00", "22/06/2022 0:09:00", "22/06/2022 0:10:00", "22/06/2022 0:11:00", "22/06/2022 0:14:00")

Session_Duration <- c("6:11", "8:22", "9:59", "8:09", "4:55")

df <- data.frame(SessionEnd, Session_Duration)

The output should look like the one below.

Session_End Session_Duration Session_Start
22/06/2022 0:01:00 6:11 21/06/2022 23:54:49
22/06/2022 0:09:00 8:22 22/06/2022 00:00:38
22/06/2022 0:10:00 9:59 22/06/2022 00:00:01
22/06/2022 0:11:00 8:09 22/06/2022 00:02:51
22/06/2022 0:14:00 4:55 22/06/2022 00:09:05

CodePudding user response:

It would be easy to do this with functions from lubridate package -

library(dplyr)
library(lubridate)

df %>%
  mutate(SessionEnd = dmy_hms(SessionEnd), 
         Session_Duration = ms(Session_Duration), 
         SessionStart = SessionEnd - Session_Duration) #%>%
  #If you want to maintain the same format as input add the below line
  #mutate(across(c(SessionEnd, SessionStart), format, '%d/%m/%Y %H:%M:%S'))

#           SessionEnd Session_Duration        SessionStart
#1 2022-06-22 00:01:00           6M 11S 2022-06-21 23:54:49
#2 2022-06-22 00:09:00           8M 22S 2022-06-22 00:00:38
#3 2022-06-22 00:10:00           9M 59S 2022-06-22 00:00:01
#4 2022-06-22 00:11:00            8M 9S 2022-06-22 00:02:51
#5 2022-06-22 00:14:00           4M 55S 2022-06-22 00:09:05

CodePudding user response:

You can convert the duration into seconds and subtract them.

strptime(df$SessionEnd, '%d/%m/%Y %T') -
  colSums(t(type.convert(
    do.call(rbind, strsplit(df$Session_Duration, ':')), as.is=TRUE))*c(60, 1))
# [1] "2022-06-21 23:54:49 CEST" "2022-06-22 00:00:38 CEST"
# [3] "2022-06-22 00:00:01 CEST" "2022-06-22 00:02:51 CEST"
# [5] "2022-06-22 00:09:05 CEST"
  • Related