У меня есть фрейм данных, называемый данными, который имеет информацию о дате и времени в столбце в следующем формате: мм/дд/гггг чч: мм: сс am/pm
Я хочу создать значения периода времени: в течение 1 часа, в течение 2 часов и т. д.
несколько строк моего фрейма данных:
time timeperiod refer x.x
1 05/07/2017 18:00:15 NA 1 23.97370
2 06/08/2017 06:21:12 NA 1 23.79394
3 06/08/2017 08:03:11 NA 1 23.79394
4 06/08/2017 08:12:47 NA 1 23.79394
5 07/07/2017 10:41:45 NA 1 23.54257
6 1/21/2017 8:10:20 AM NA 1 21.06460
7 1/9/2013 10:01:32 PM NA 2 23.99733
8 1/9/2013 10:01:32 PM NA 2 23.99733
9 1/9/2013 10:01:32 PM NA 2 21.06460
10 1/9/2013 10:01:32 PM NA 2 21.06460
Я старался: strftime(data$time., format = "%m/%d/%y %H:%M:%S" %r), но я получаю следующую ошибку:
Ошибка в as.POSIXlt.character(as.character(x),...) : строка символов не имеет стандартного однозначного формата
Что такое AM/PM для первых 5 элементов?
получение той же ошибки: Ошибка в as.POSIXlt.character(as.character(x),...) : строка символов не имеет стандартного однозначного формата
akrun, только что заметил, эти строки были в 24-часовом формате, я изменил их на тот же формат мм/дд/гггг чч:мм:сс am/pm
Вам нужно будет указать два разных формата для времени. Строки в формате 12-часового формата (последние 5 строк) должны быть такими, как в комментарии @akrun, в то время как строки с 24-часовым форматом часов требуют %H
для указания часа вместо %I
и опускания %p
. Вам нужно условно применить один из этих двух разных форматов
Вариант был бы
i1 <- grepl("AM|PM", df1$time)
out <- as.POSIXct(rep(NA_real_, nrow(df1)), origin = "1970-01-01")
out[i1] <- as.POSIXct(df1$time[i1], format = "%m/%d/%Y %I:%M:%S %p")
out[!i1] <- as.POSIXct(df1$time[!i1], format = '%m/%d/%Y %H:%M:%S')
droplevels(cut(out, breaks = "1 hour"))
#[1] 2017-05-07 18:00:00 2017-06-08 06:00:00 2017-06-08 08:00:00 2017-06-08 08:00:00 2017-07-07 10:00:00 2017-01-21 08:00:00
#[7] 2013-01-09 22:00:00 2013-01-09 22:00:00 2013-01-09 22:00:00 2013-01-09 22:00:00
#Levels: 2013-01-09 22:00:00 2017-01-21 08:00:00 2017-05-07 18:00:00 2017-06-08 06:00:00 2017-06-08 08:00:00 2017-07-07 10:00:00
Или еще вариант parse_date
из parsedate
и floor_date
library(lubridate)
library(parsedate)
floor_date(parse_date(df1$time), "hour")
#[1] "2017-05-07 18:00:00 UTC" "2017-06-08 06:00:00 UTC" "2017-06-08 08:00:00 UTC" "2017-06-08 08:00:00 UTC" "2017-07-07 10:00:00 UTC"
#[6] "2017-01-21 08:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC"
df1 <- structure(list(time = c("05/07/2017 18:00:15", "06/08/2017 06:21:12",
"06/08/2017 08:03:11", "06/08/2017 08:12:47", "07/07/2017 10:41:45",
"1/21/2017 8:10:20 AM", "1/9/2013 10:01:32 PM", "1/9/2013 10:01:32 PM",
"1/9/2013 10:01:32 PM", "1/9/2013 10:01:32 PM"), timeperiod = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA), refer = c(1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L), x.x = c(23.9737, 23.79394, 23.79394,
23.79394, 23.54257, 21.0646, 23.99733, 23.99733, 21.0646, 21.0646
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5",
"6", "7", "8", "9", "10"))
Попробуйте с
cut(as.POSIXct(df1$time, "%m/%d/%Y %I:%M:%S %p"), "1 hour")