Transform variable into a %H:%M time format in R

Go To


I have this vector representing time recorded as hours (0 to 24) and minute (0 to 59). I would like to transform it into a %H:%M time format in R such that I can use function like difftime.

 int [1:11452] 1940 600 5 1455 1443 2248 1115 900 200 420 ...

This is what I've tried, but in both cases, I got an error:

>SF5$time1<-as.POSIXct(SF5$ES_TIME, format = "%H:%M",tz="EST")
Error in as.POSIXct.numeric(SF5$ES_TIME, format = "%H:%M", tz = "EST") : 
  'origin' must be supplied
SF5$time1<-as.POSIXct(as.character(SF5$ES_TIME), format="%H:%M",tz="")
> str(SF5$time1)
POSIXct[1:11452], format: NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA ...

Any help or reading suggestions would be much appreciated! Thank you, Aurelie

2012-04-04 17:37
by GodinA
in your example, what does 5 and 600 signify? working to get all your numbers into four digits with zero padding (e.g sprintf("%04d", 1)) will be a good start. then something what you've tried should work. as.POSIXct('1940', format='%H%M')Justin 2012-04-04 17:50


Well, the error message tells you to provide origin and a minute is 60 seconds, so:

SF5 <- list(ES_TIME=as.integer(c(1940,600,5,1455,1443,2248,1115,900,200,420)))

x <- as.POSIXct(SF5$ES_TIME*60, origin="1970-01-01")
format(x, format="%H:%M")
#[1] "08:20" "10:00" "00:05" "00:15" "00:03" "13:28" "18:35" "15:00" "03:20" "07:00"

Note that the POSIXct date is just a number (with a class), so you need the format call to print it as you want - the default printing of x would print the full date info (year/month/day etc).

...any origin date would do since you don't care about it, but 1970-01-01 is the usual origin...

2012-04-04 18:29
by Tommy


I was able to crack down the code! Thank you all for your tip!

#1) as suggested by Justin : put all numbers into four digits with zero padding
#2) Matched these %H%M with their corresponding date %y-%m-%d
    SF5$ES.datetime <- paste(SF5$ES_TIME2,SF5$ES_DATE,sep=" ")
#3) Transform into Date-Time format
    SF5$ES.datetime2 <- as.POSIXct(SF5$ES.datetime,format="%H%M %y-%m-%d", tz="")

# Did the same for my other time-date of interest
SF5$SH.datetime <- paste(SF5$SH_TIME2,SF5$SH_DATE,sep=" ")
SF5$SH.datetime2 <- as.POSIXct(SF5$SH.datetime,format="%H%M %y-%m-%d", tz="")

# Calculate the time difference between the 2 date-time in hours
2012-04-05 16:32
by GodinA
Hmm. Here you actually use the date part too, not just the time part. That wasn't in your original question - Tommy 2012-04-06 00:59
Agreed, my bad. I realized afterward that I had the dates available - GodinA 2012-04-09 15:12