R: установите столбец фрейма данных как дату и время, чтобы создать интервалы

У меня есть фрейм данных, называемый данными, который имеет информацию о дате и времени в столбце в следующем формате: мм/дд/гггг чч: мм: сс 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),...) : строка символов не имеет стандартного однозначного формата

Попробуйте с cut(as.POSIXct(df1$time, "%m/%d/%Y %I:%M:%S %p"), "1 hour")

akrun 27.05.2019 22:43

Что такое AM/PM для первых 5 элементов?

akrun 27.05.2019 22:44

получение той же ошибки: Ошибка в as.POSIXlt.character(as.character(x),...) : строка символов не имеет стандартного однозначного формата

Stathis G. 27.05.2019 22:46

akrun, только что заметил, эти строки были в 24-часовом формате, я изменил их на тот же формат мм/дд/гггг чч:мм:сс am/pm

Stathis G. 27.05.2019 22:47

Вам нужно будет указать два разных формата для времени. Строки в формате 12-часового формата (последние 5 строк) должны быть такими, как в комментарии @akrun, в то время как строки с 24-часовым форматом часов требуют %H для указания часа вместо %I и опускания %p. Вам нужно условно применить один из этих двух разных форматов

qdread 27.05.2019 22:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант был бы

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"))

Другие вопросы по теме