2015-07-15 3 views
0

У меня есть 2 столбца в моей кадре данных, на которых я хочу выполнять такие операции, как добавление часов или добавление дней.Как выполнять операции с датой типа «% Y /% m /% d% H:% M»?

Например, я хочу проверить, находится ли моя дата2 в диапазоне [date1; DATE1 + 30 дней]

Я попытался это:

table(data$date1 <= data$date2 & data$date2 <= data$date1 + 30) 

И я получаю эту ошибку:

Error in data$date1 + 30 : 
    non-numeric argument to binary operator 

Я Тансформация date1 и date2 в формате даты с:

data$date1 <- substr(data$date1,1,16) 
    data$date1 <- format(data$date1, format="%Y-%m-%d %H:%M") 

Готовую к эксплуатации:

 id1 id2   date2    date1 
    1 CD0H 15741  2012/02/08 10:03 16/02/2015 16:22 
    2 CD00 15058  2011/05/19 09:25 07/05/2015 10:39 
    3 CHY0 15987  2011/01/20 11:58 06/02/2015 14:11 
    4 CTPO 15254  2010/09/29 12:45 01/04/2015 04:49 
    5 CDHY 15051       06/05/2015 15:01 
    6 CDJU 15035       17/04/2015 08:56 
+1

как 'data' выглядит как? –

+2

Можете ли вы разместить сообщение 'dput (head (data))'? –

+0

мой пост обновлен – SparkUser

ответ

1

Возможно преобразование в дату/время,-объектов не работает:

library(lubridate) 

data <- read.table(filename, header=TRUE, sep = ";") 

data$date1 <- substr(data$date1,1,16) 
data$date1 <- format(data$date1, format="%Y/%m/%d %H:%M") 

data$date2 <- substr(data$date2,1,16) 
data$date2 <- format(data$date2, format="%d/%m/%Y %H:%M") 

Класс по-прежнему «характер»:

> class(data$date1) 
[1] "character" 

я преобразование следующим образом:

library(timeDate) 

table <- read.table(filename, header=TRUE, sep = ";", 
        colClasses = c("factor", "numeric", "character", "character")) 

data <- cbind(table[1:2], 
       apply(table[3], 2, FUN=function(x){ timeDate(x,format="%Y/%m/%d %H:%M") }), 
       apply(table[4], 2, FUN=function(x){ timeDate(x,format="%d/%m/%Y %H:%M") })) 

colnames(data) <- colnames(table) 

Это более сложный, но, по крайней мере, у нас есть время и дату:

> class(data$date1) 
[1] "POSIXct" "POSIXt" 
> (data$date1 <= data$date2 + as.difftime(4*365,units="days")) & (data$date2 <= data$date1 + as.difftime(30,units="days")) 
[1] TRUE TRUE FALSE FALSE NA NA 
0

Отъезд библиотеки lubridate для работы с датами и временем.

Вот как вы бы добавить в течение 30 дней с помощью lubridate

library(lubridate) 

ymd('2011-01-01') + days(30) 
[1] "2011-01-31 UTC" 

Для получения дополнительной информации:

http://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html

+0

Я пытался заставить его работать с ymd_hms, но он не работает: > (данные $ date1) [c (1: 5)] "2012/02/08 10:03" " 2011/05/19 09:25 "" 2011/01/20 11:58 "" 2010/09/29 12:45 "" " > (ymd_hms (данные $ date1)) [c (1: 5)] "2020-12-02 08:10:03 UTC" "2020-11-05 19:09:25 UTC" "2020-11-01 20:11:58 UTC" NA NA – SparkUser

Смежные вопросы