34

我目前正在为我正在构建的包的日期和时间玩很多。

偶然发现这篇文章再次提醒我,在转向 contrib 包之前检查是否可以使用基本 R 功能完成某些事情通常不是一个坏主意。

因此,是否可以POSIXct使用基本 R 功能对课程日期进行舍入?

我检查了

methods(round)

哪个“只”给了我

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked

这就是我想做的(伪代码)

x <- as.POSIXct(Sys.time())
[1] "2012-07-04 10:33:55 CEST"

round(x, atom="minute")
[1] "2012-07-04 10:34:00 CEST"

round(x, atom="hour")
[1] "2012-07-04 11:00:00 CEST"

round(x, atom="day")
[1] "2012-07-04 CEST"

我知道这可以通过timeDatelubridate等来完成,但我想降低包依赖性。所以在继续检查各个包的源代码之前,我想我会问是否有人已经做过这样的事情。

4

3 回答 3

46

base必须round.POSIXt这样做。不知道为什么它没有出现methods

x <- as.POSIXct(Sys.time())
x
[1] "2012-07-04 10:01:08 BST"
round(x,"mins")
[1] "2012-07-04 10:01:00 BST"
round(x,"hours")
[1] "2012-07-04 10:00:00 BST"
round(x,"days")
[1] "2012-07-04"
于 2012-07-04T09:04:42.560 回答
17

在这个主题上lubridate,还要研究ceiling_date()floor_date()函数:

x <- as.POSIXct("2009-08-03 12:01:59.23")
ceiling_date(x, "second")
# "2009-08-03 12:02:00 CDT"
ceiling_date(x, "hour")
# "2009-08-03 13:00:00 CDT"
ceiling_date(x, "day")
# "2009-08-04 CDT"
ceiling_date(x, "week")
# "2009-08-09 CDT"
ceiling_date(x, "month")
# "2009-09-01 CDT"
于 2013-01-23T05:18:26.313 回答
1

如果您不想调用外部库并想像我一样保留这是一个想法(受此问题POSIXct的启发):使用 strptime 并粘贴假的月份和日期。如本评论所述,应该可以更直接地做到这一点

“对于 strptime,输入字符串不需要完全指定日期:假设未指定的秒、分钟或小时为零,并且未指定的年、月或日是当前日期。”

因此,您似乎必须使用strftime输出截断的字符串,粘贴丢失的部分并在 POSIXct 中再次转换。

这是更新答案的外观:

x <- as.POSIXct(Sys.time())
x
[1] "2018-12-27 10:58:51 CET"
round(x,"mins")
[1] "2018-12-27 10:59:00 CET"
round(x,"hours")
[1] "2018-12-27 11:00:00 CET"
round(x,"days")
[1] "2018-12-27 CET"
as.POSIXct(paste0(strftime(x,format="%Y-%m"),"-01"))     #trunc by month
[1] "2018-12-01 CET"
as.POSIXct(paste0(strftime(x,format="%Y"),"-01-01"))     #trunc by year
[1] "2018-01-01 CET"
于 2018-12-27T10:12:57.707 回答