I received from data from a stream flow data logger but the time is recorded in 12-hour time without information on AM or PM. I can infer by looking at the order of the times whether it is AM or PM but I need to convert them to 24-hour time.
I have other logger data that uses 24-hour time so I need to make sure they match. I used the as.POSIXct() to format all the other data but I am having issues with this particular set.
I am using R for this analysis.
Here is what the data look like:
Date_Time PT.Level
2008-11-21 11:40:00 0.7502
2008-11-21 11:45:00 0.7502
2008-11-21 11:50:00 0.7480
2008-11-21 11:55:00 0.7458
2008-11-22 12:00:00 0.7458
2008-11-22 12:05:00 0.7436
2008-11-22 12:05:42 NA
2008-11-22 12:10:00 0.7436
2008-11-22 12:15:00 0.7414
# [...] [...]
2008-11-22 11:45:00 0.7304
2008-11-22 11:50:00 0.7304
2008-11-22 11:55:00 0.7304
2008-11-22 12:00:00 0.7282
2008-11-22 12:00:43 NA
2008-11-22 12:05:00 0.7282
2008-11-22 12:10:00 0.7282
2008-11-22 12:15:00 0.7282
Any suggestions?
Using ave
with cumsum
. If there's no switch within a day, we need case handling using table
. For duplicated hours we may set diff == 0
to FALSE
.
I don't know how complete your data is, but this should work if there are no dupes and always 00:00
and 12:00
is available each day.
v2 <- ave(as.numeric(substr(v1, 12, 13)) %% 12 == 0, as.Date(v1), FUN=function(x) {
if (length(table(x)) == 1) 2
else {
x[c(1, diff(x)) == 0] <- FALSE
cumsum(x)
}
})
v2 <- c("AM", "PM")[v2]
cbind.data.frame(v, v1, v2)
# v v1 v2
# 1 2020-05-22 22:00:00 2020-05-22 10:00:00 PM
# 2 2020-05-22 23:00:00 2020-05-22 11:00:00 PM
# 3 2020-05-23 00:00:00 2020-05-23 12:00:00 AM
# 4 2020-05-23 00:01:00 2020-05-23 12:01:00 AM ## duplicated 12 stays AM
# 5 2020-05-23 00:59:00 2020-05-23 12:59:00 AM ## duplicated 12 stays AM
# 6 2020-05-23 01:00:00 2020-05-23 01:00:00 AM
# 7 2020-05-23 02:00:00 2020-05-23 02:00:00 AM
# 8 2020-05-23 03:00:00 2020-05-23 03:00:00 AM
# 9 2020-05-23 04:00:00 2020-05-23 04:00:00 AM
# 10 2020-05-23 05:00:00 2020-05-23 05:00:00 AM
# 11 2020-05-23 06:00:00 2020-05-23 06:00:00 AM
# 12 2020-05-23 07:00:00 2020-05-23 07:00:00 AM
# 13 2020-05-23 08:00:00 2020-05-23 08:00:00 AM
# 14 2020-05-23 09:00:00 2020-05-23 09:00:00 AM
# 15 2020-05-23 10:00:00 2020-05-23 10:00:00 AM
# 16 2020-05-23 11:00:00 2020-05-23 11:00:00 AM
# 17 2020-05-23 12:00:00 2020-05-23 12:00:00 PM
# 18 2020-05-23 13:00:00 2020-05-23 01:00:00 PM
# 19 2020-05-23 14:00:00 2020-05-23 02:00:00 PM
# 20 2020-05-23 15:00:00 2020-05-23 03:00:00 PM
# 21 2020-05-23 16:00:00 2020-05-23 04:00:00 PM
# 22 2020-05-23 17:00:00 2020-05-23 05:00:00 PM
# 23 2020-05-23 18:00:00 2020-05-23 06:00:00 PM
# 24 2020-05-23 19:00:00 2020-05-23 07:00:00 PM
# 25 2020-05-23 20:00:00 2020-05-23 08:00:00 PM
# 26 2020-05-23 21:00:00 2020-05-23 09:00:00 PM
# 27 2020-05-23 22:00:00 2020-05-23 10:00:00 PM
# 28 2020-05-23 23:00:00 2020-05-23 11:00:00 PM
# 29 2020-05-24 00:00:00 2020-05-24 12:00:00 AM
# 30 2020-05-24 01:00:00 2020-05-24 01:00:00 AM
# 31 2020-05-24 02:00:00 2020-05-24 02:00:00 AM
# 32 2020-05-24 03:00:00 2020-05-24 03:00:00 AM
# 33 2020-05-24 04:00:00 2020-05-24 04:00:00 AM
# 34 2020-05-24 05:00:00 2020-05-24 05:00:00 AM
# 35 2020-05-24 06:00:00 2020-05-24 06:00:00 AM
# 36 2020-05-24 07:00:00 2020-05-24 07:00:00 AM
# 37 2020-05-24 08:00:00 2020-05-24 08:00:00 AM
# 38 2020-05-24 09:00:00 2020-05-24 09:00:00 AM
# 39 2020-05-24 10:00:00 2020-05-24 10:00:00 AM
# 40 2020-05-24 11:00:00 2020-05-24 11:00:00 AM
# 41 2020-05-24 12:00:00 2020-05-24 12:00:00 PM
# 42 2020-05-24 13:00:00 2020-05-24 01:00:00 PM
# 43 2020-05-24 14:00:00 2020-05-24 02:00:00 PM
# 44 2020-05-24 15:00:00 2020-05-24 03:00:00 PM
# 45 2020-05-24 16:00:00 2020-05-24 04:00:00 PM
# 46 2020-05-24 17:00:00 2020-05-24 05:00:00 PM
# 47 2020-05-24 18:00:00 2020-05-24 06:00:00 PM
# 48 2020-05-24 19:00:00 2020-05-24 07:00:00 PM
# 49 2020-05-24 20:00:00 2020-05-24 08:00:00 PM
# 50 2020-05-24 21:00:00 2020-05-24 09:00:00 PM
##Result
cbind.data.frame(v, v1, v2)
[]()
# v v1 v2
# 1 2020-05-22 22:00:00 2020-05-22 10:00 PM
# 2 2020-05-22 23:00:00 2020-05-22 11:00 PM
# 3 2020-05-23 00:00:00 2020-05-23 12:00 AM
# 4 2020-05-23 01:00:00 2020-05-23 01:00 AM
# 5 2020-05-23 02:00:00 2020-05-23 02:00 AM
# 6 2020-05-23 03:00:00 2020-05-23 03:00 AM
# 7 2020-05-23 04:00:00 2020-05-23 04:00 AM
# 8 2020-05-23 05:00:00 2020-05-23 05:00 AM
# 9 2020-05-23 06:00:00 2020-05-23 06:00 AM
# 10 2020-05-23 07:00:00 2020-05-23 07:00 AM
# 11 2020-05-23 08:00:00 2020-05-23 08:00 AM
# 12 2020-05-23 09:00:00 2020-05-23 09:00 AM
# 13 2020-05-23 10:00:00 2020-05-23 10:00 AM
# 14 2020-05-23 11:00:00 2020-05-23 11:00 AM
# 15 2020-05-23 12:00:00 2020-05-23 12:00 PM
# 16 2020-05-23 13:00:00 2020-05-23 01:00 PM
# 17 2020-05-23 14:00:00 2020-05-23 02:00 PM
# 18 2020-05-23 15:00:00 2020-05-23 03:00 PM
# 19 2020-05-23 16:00:00 2020-05-23 04:00 PM
# 20 2020-05-23 17:00:00 2020-05-23 05:00 PM
# 21 2020-05-23 18:00:00 2020-05-23 06:00 PM
# 22 2020-05-23 19:00:00 2020-05-23 07:00 PM
# 23 2020-05-23 20:00:00 2020-05-23 08:00 PM
# 24 2020-05-23 21:00:00 2020-05-23 09:00 PM
# 25 2020-05-23 22:00:00 2020-05-23 10:00 PM
# 26 2020-05-23 23:00:00 2020-05-23 11:00 PM
# 27 2020-05-24 00:00:00 2020-05-24 12:00 AM
# 28 2020-05-24 01:00:00 2020-05-24 01:00 AM
# 29 2020-05-24 02:00:00 2020-05-24 02:00 AM
# 30 2020-05-24 03:00:00 2020-05-24 03:00 AM
# 31 2020-05-24 04:00:00 2020-05-24 04:00 AM
# 32 2020-05-24 05:00:00 2020-05-24 05:00 AM
# 33 2020-05-24 06:00:00 2020-05-24 06:00 AM
# 34 2020-05-24 07:00:00 2020-05-24 07:00 AM
# 35 2020-05-24 08:00:00 2020-05-24 08:00 AM
# 36 2020-05-24 09:00:00 2020-05-24 09:00 AM
# 37 2020-05-24 10:00:00 2020-05-24 10:00 AM
# 38 2020-05-24 11:00:00 2020-05-24 11:00 AM
# 39 2020-05-24 12:00:00 2020-05-24 12:00 PM
# 40 2020-05-24 13:00:00 2020-05-24 01:00 PM
# 41 2020-05-24 14:00:00 2020-05-24 02:00 PM
# 42 2020-05-24 15:00:00 2020-05-24 03:00 PM
# 43 2020-05-24 16:00:00 2020-05-24 04:00 PM
# 44 2020-05-24 17:00:00 2020-05-24 05:00 PM
# 45 2020-05-24 18:00:00 2020-05-24 06:00 PM
# 46 2020-05-24 19:00:00 2020-05-24 07:00 PM
# 47 2020-05-24 20:00:00 2020-05-24 08:00 PM
# 48 2020-05-24 21:00:00 2020-05-24 09:00 PM
I think this can easily be scaled up to minutes and seconds, I don't want to spoil your fun:)
Data:
v <- as.POSIXct(sapply(1:48, function(x) 1590174000 + x*60*60),
origin="1970-01-01")
v <- c(v[1:3], v[3]+60, v[3]+60*59, v[4:length(v)]) ## duplicate some 12 o'clocks
v1 <- format(v, "%Y-%m-%d %I:%M:%S")