2015-05-19 4 views
3

Я новичок в R и у меня есть кадр данных с датой времени как переменная. За каждый час регистрируется температура каждого дня, а время даты - в формате ГГГГ-ММ-ДД 00:00:00. Теперь я хотел бы преобразовать время в коэффициент от 0 до 23 каждый день. Итак, для каждого дня моя новая колонка должна иметь факторы от 0 до 23. Может ли кто-нибудь помочь мне с этим? Мой 2015-01-01 00:00:00, должен дать мне 0, а 2015-01-01 01:00:00, должен дать мне 1 и так далее. Также мой 2015-01-02 00:00:00 должен быть снова 0.R Преобразование даты времени

ответ

1

Используя пример данных, одним из способов было бы следующее.

mydf <- data.frame(id = c(1,1,1,2,2,1,1), 
        event = c("start", "valid", "end", "start", "bad", "start", "bad"), 
        time = as.POSIXct(c("2015-05-16 20:46:53", "2015-05-16 20:46:56", "2015-05-16 21:46:59", 
            "2015-05-16 22:46:53", "2015-05-16 22:47:00", "2015-05-16 22:49:05", 
            "2015-05-16 23:49:09"), format = "%Y-%m-%d %H:%M:%S"), 
        stringsAsFactors = FALSE) 

library(dplyr) 
mutate(mydf, group = factor(format(time, "%H"))) 

# id event    time group 
#1 1 start 2015-05-16 20:46:53 20 
#2 1 valid 2015-05-16 20:46:56 20 
#3 1 end 2015-05-16 21:46:59 21 
#4 2 start 2015-05-16 22:46:53 22 
#5 2 bad 2015-05-16 22:47:00 22 
#6 1 start 2015-05-16 22:49:05 22 
#7 1 bad 2015-05-16 23:49:09 23 
+1

Зачем загружать 'dplyr' для добавления одной переменной? – thelatemail

+0

@thelatemail Вам не обязательно. По умолчанию у меня есть 'dplyr', работающий на моей машине и использующий его. :) – jazzurro

+0

@SairamReddy Мое удовольствие. Я рад, что это вам помогло. :) – jazzurro

4

Вы можете преобразовать метку в объект POSIXlt. Как только у вас есть это, вы можете получить этот час прямо следующим образом:

> timestamp <- as.POSIXlt("2015-01-01 00:00:00") 
> timestamp 
[1] "2015-01-01 MYT" 
> timestamp$hour 
[1] 0 
1

ответ Тима, используя POSIXlt, вероятно, лучший вариант, но вот регулярное выражение способ только в случае, если:

> times <- c("2015-01-01 00:00:00", "2015-01-01 01:00:00", "2015-01-02 00:00:00") 
> regmatches(times, regexpr("(?<=-\\d{2})\\d{2}", times, perl=TRUE)) 
[1] "00" "01" "00" 

С добытых часов вы можете сделать их факторы или целые числа по мере необходимости.

+0

Очень хорошая альтернатива! –

+1

Регулярное задание для этой задачи - час всегда одного и того же двух символов, поэтому используйте подстроку - 'substr (times, 12,13)' – thelatemail

1

@Sairam, в дополнение к использованию jazzurro 'dplyr' (которое, как и jazzurro, многие R-insitas обычно используют) ... в будущем, если вам нужен или нужен простой & мощный способ манипулирования датами , вам рекомендуется ознакомиться с другим пакетом: «lubridate».

lubridate работает с датами. Надеюсь, что это поможет и с наилучшими пожеланиями в вашем проекте.