使用lubridate在R中修改POSIXct格式的日期

时间:2016-02-03 20:18:30

标签: r date 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 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

问题是 remote: GitLab: You are not allowed to push code to protected branches on this project. 。它剥离了属性。

但是,既然您正在使用 lubridate 包,为什么不使用其ifelse()替换功能来替换年份?有了它,我们可以一起避免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)会帮助你更多,因为你已经在使用 lubridate 包。