Разрезать день на несколько частей - PullRequest
2 голосов
/ 30 марта 2020

Чтобы найти правильный уровень агрегации для моих данных, мне нужно разбить день на кадры разных размеров.

Пример данных:

da = data.frame(timestamp = c("2016-01-24 01:17:37 GMT" ,"2016-01-24 02:09:41 GMT", "2016-01-24 13:34:35 GMT", "2016-01-24 15:17:56 GMT", "2016-01-24 18:14:55 GMT"))

da
                timestamp
1 2016-01-24 01:17:37 GMT
2 2016-01-24 02:09:41 GMT
3 2016-01-24 13:34:35 GMT
4 2016-01-24 15:17:56 GMT
5 2016-01-24 18:14:55 GMT

Например, я могу начать вырезать день в 24 частях. Затем с 0:00 до 1:00 - это часть 1, с 1:00 до 2:00 - это часть 2 и т. Д. c.

da2 = data.frame(timestamp = c("2016-01-24 01:17:37 GMT" ,"2016-01-24 02:09:41 GMT", "2016-01-24 13:34:35 GMT", "2016-01-24 15:17:56 GMT", "2016-01-24 18:14:55 GMT"),
                 daypart = c(2, 3, 14, 16, 19))
da2
                timestamp daypart
1 2016-01-24 01:17:37 GMT       2
2 2016-01-24 02:09:41 GMT       3
3 2016-01-24 13:34:35 GMT      14
4 2016-01-24 15:17:56 GMT      16
5 2016-01-24 18:14:55 GMT      19

Или на 48 частей. Затем с 0:00 до 0:30 будет часть 1, с 0:30 до 1:00 часть 2 et c:

da48 = data.frame(timestamp = c("2016-01-24 01:17:37 GMT" ,"2016-01-24 02:09:41 GMT", "2016-01-24 13:34:35 GMT", "2016-01-24 15:17:56 GMT", "2016-01-24 18:14:55 GMT"),
+                  daypart = c(3, 5, 28, 31, 37))
da48
                timestamp daypart
1 2016-01-24 01:17:37 GMT       3
2 2016-01-24 02:09:41 GMT       5
3 2016-01-24 13:34:35 GMT      28
4 2016-01-24 15:17:56 GMT      31
5 2016-01-24 18:14:55 GMT      37

Я нашел этот пост Поз. О том, как преобразовать время в категориальное переменная , которая уже помогает, но как я могу кодировать это так, чтобы мне нужно было только изменить количество частей, на которые я хочу разрезать день?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Поверните timestamp к объекту POSIXlt и извлеките час времени с помощью символа $.

da$daypart <- as.POSIXlt(da$timestamp)$hour + 1

#                 timestamp daypart
# 1 2016-01-24 01:17:37 GMT       2
# 2 2016-01-24 02:09:41 GMT       3
# 3 2016-01-24 13:34:35 GMT      14
# 4 2016-01-24 15:17:56 GMT      16
# 5 2016-01-24 18:14:55 GMT      19

Редактировать: Разделить время на 48 частей

time <- as.POSIXlt(da$timestamp)
da$daypart48 <- time$hour * 2 + (time$min > 30) + 1
da

#                 timestamp daypart daypart48
# 1 2016-01-24 01:17:37 GMT       2         3
# 2 2016-01-24 02:09:41 GMT       3         5
# 3 2016-01-24 13:34:35 GMT      14        28
# 4 2016-01-24 15:17:56 GMT      16        31
# 5 2016-01-24 18:14:55 GMT      19        37
2 голосов
/ 30 марта 2020

Вы можете strsplit время в :,

(tmp <- do.call(rbind, 
                strsplit(strftime(as.POSIXct(da$timestamp), "%H:%M:%S"), ":")))
#      [,1] [,2] [,3]
# [1,] "01" "17" "37"
# [2,] "02" "09" "41"
# [3,] "13" "34" "35"
# [4,] "15" "17" "56"
# [5,] "18" "14" "55"

рассчитать в секундах,

(sec <- apply(tmp, 2, as.numeric) %*% c(60*60, 60, 1))
#       [,1]
# [1,]  4657
# [2,]  7781
# [3,] 48875
# [4,] 55076
# [5,] 65695

и match с ежедневными секундами cut на 24 части .

da$daypart <- cut(1:(24*60*60), 24, labels=1:24)[match(sec, 1:(24*60*60))]

Результат

da
#              timestamp daypart
# 1 2016-01-24 01:17:37 GMT    2
# 2 2016-01-24 02:09:41 GMT    3
# 3 2016-01-24 13:34:35 GMT   14
# 4 2016-01-24 15:17:56 GMT   16
# 5 2016-01-24 18:14:55 GMT   19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...