R: How to handle times without dates?

date, r, r-faq, time

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

Problem

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!

Original source

Related problems