2016-02-03 7 views
2

У меня есть пять дат в следующем формате:Изменение даты в формате POSIXct в R с использованием lubridate

five_dates <- c("2015-04-13 22:56:01 UTC", "2015-04-13 23:00:29 UTC", "2014-04-13 23:01:22 UTC", "2013-04-13 23:01:39 UTC", "2013-04-13 23:01:43 UTC") 

Используя lubridate пакет, я обрабатывал их, выполнив следующие действия:

five_dates <- lubridate::ymd_hms(five_dates) 
str(five_dates) 
[1] POSIXct[1:5], format: "2015-04-13 22:56:01" "2015-04-13 23:00:29" "2014-04-13 23:01:22" "2013-04-13 23:01:39" "2013-04-13 23:01:43" 

Я хочу добавить год на даты в 2013 году:

five_dates <- ifelse(lubridate::year(five_dates) < 2014, five_dates + years(1), five_dates) 

Но это приводит к выводу:

five_dates 
[1] 1428965761 1428966029 1397430082 1397430099 1397430103 

Как добавить год к датам в 2013 году, чтобы выход был также датой?

ответ

2

Про blem - ifelse(). Он разделяет атрибуты.

Но так как вы используете пакет lubridate, почему бы не использовать функцию замены year<-, чтобы заменить год на другой? С его помощью мы можем избежать ifelse() все вместе.

yr <- 2013 
year(five_dates[year(five_dates) == yr]) <- yr + 1 
five_dates 
# [1] "2015-04-13 22:56:01 UTC" "2015-04-13 23:00:29 UTC" 
# [3] "2014-04-13 23:01:22 UTC" "2014-04-13 23:01:39 UTC" 
# [5] "2014-04-13 23:01:43 UTC" 

Или с помощью кода, вы могли бы захватить класс перед ifelse() вызова, а затем назначить его обратно.

cl <- class(five_dates) 
five_dates <- ifelse(...) 
class(five_dates) <- cl 

Примеры показаны в help(ifelse). Но я думаю, year<- поможет вам больше здесь, так как вы уже используете пакет lubridate.

+0

Я выбираю этот ответ, потому что я думаю, что предпочитаю оставаться на земле «lubridate». –

+1

Хороший ответ. @JoshuaRosenberg второй вариант в моем ответе также находится в * lubridate-land * ;-) – Jaap

3

ifelse удаляет форматирование даты. Вы должны преобразовать его обратно:

five_dates <- as.POSIXct(five_dates, origin="1970-01-01", tz = "UTC") 

, который дает:

> five_dates 
[1] "2015-04-13 22:56:01 UTC" "2015-04-13 23:00:29 UTC" 
[3] "2014-04-13 23:01:22 UTC" "2014-04-13 23:01:39 UTC" 
[5] "2014-04-13 23:01:43 UTC" 

Альтернатива для ifelse операции, которая достигает такой же:

five_dates <- five_dates + years(as.integer(year(five_dates) < 2014)) 

дает:

> five_dates 
[1] "2015-04-13 22:56:01 UTC" "2015-04-13 23:00:29 UTC" 
[3] "2014-04-13 23:01:22 UTC" "2014-04-13 23:01:39 UTC" 
[5] "2014-04-13 23:01:43 UTC" 
Смежные вопросы