Reputation: 311
I need to parse times in a character format like "1:36:22 PM".
I've tried various permutations of as.POSIXct
and strptime
but just can't get there. For example, this fails to pick up the importance of PM:
t <- "1:36:22 PM"
as.POSIXct(t, format = "%H:%M:%S")
# [1] "2016-09-08 01:36:22 BST"
and this fails:
strptime(t, "%H:%M:%S")
# [1] NA
Curiously, for reasons I can't understand, dropping the seconds from the input may work:
t <- "1:30:00 PM"
strptime(t, "%I:%M %p")
# [1] NA
t <- "1:30 PM"
strptime(t, "%I:%M %p")
# [1] "2016-09-08 13:30:00 BST"
All I want is for this to work:
t <- "1:30:00 PM"
SOME COMMAND HERE HERE
# [1] "13:30:00"
Any ideas?
Upvotes: 19
Views: 27657
Reputation: 4554
Use the conversion specifications %I
and %p
. See Details section in ?strptime
:
%I
Hours as decimal number (01–12).>
%p
AM/PM indicator in the locale. Used in conjunction with%I
and not with%H
.
strptime(t, "%I:%M:%S %p")
Upvotes: 11
Reputation: 219
Have you tried using the lubridate package? It can handle AM/PM using the %p indicator in the "parse_date_time" function.
library(lubridate)
t <- "1:36:22 PM"
parse_date_time(t, '%I:%M:%S %p')
[1] "2016-09-08 13:36:22 UTC"
From the lubridate documentation:
%I: Hours as decimal number (01–12 or 1–12).
%M: Minute as decimal number (00–59 or 0–59).
%S: Second as decimal number (00–61 or 0–61).
%P: AM/PM indicator in the locale. Used in conjunction with I and not with H. An empty string in some locales.
Upvotes: 18