Search code examples
rdatetimer-faq

R: How to handle times without dates?


I have data which includes Date as well as Time enter and Time exit. These latter two contain data like this: 08:02, 12:02, 23:45 etc.

I would like to manipulate the Time eXXX data - for example, substract Time enter from Time exit to work out duration, or plot the distributions of Time enter and Time exit, e.g. to see if most entries are before 10:00, or if most exits are after 17:00.

All the packages I've looked at require a date to precede the time, e.g. 01/02/2012 12:33.

Is this possible, or should I simply append an identical date to every time for the sake of calculations? This seem a bit messy!


Solution

  • Use the "times" class found in the chron package:

    library(chron)
    
    Enter <- c("09:12", "17:01")
    Enter <- times(paste0(Enter, ":00"))
    
    Exit <-  c("10:15", "18:11")
    Exit <- times(paste0(Exit, ":00"))
    
    Exit - Enter # durations
    
    sum(Enter < "10:00:00") # no entering before 10am
    mean(Enter < "10:00:00") # fraction entering before 10am
    
    sum(Exit >  "17:00:00") # no exiting after 5pm
    mean(Exit >  "17:00:00") # fraction exiting after 5pm
    
    table(cut(hours(Enter), breaks = c(0, 10, 17, 24))) # Counts for indicated hours   
     ## (0,10] (10,17] (17,24] 
     ##      1       1       0 
    
    table(hours(Enter))  # Counts of entries each hour
    ## 9 17 
    ## 1  1
    
    stem(hours(Enter), scale = 2)
    ## The decimal point is at the |
    
    ##   9 | 0
    ##  10 | 
    ##  11 | 
    ##  12 | 
    ##  13 | 
    ##  14 | 
    ##  15 | 
    ##  16 | 
    ##  17 | 0
    

    Graphics:

    tab <- c(table(Enter), -table(Exit))  # Freq at each time.  Enter is pos; Exit is neg.
    plot(times(names(tab)), tab, type = "h", xlab = "Time", ylab = "Freq")
    abline(v = c(10, 17)/24, col = "red", lty = 2) # vertical red lines
    abline(h = 0)  # X axis
    

    screenshot