我正在玩很多关于我正在建造的包裹的日期和时间。
绊倒这个post再一次提醒我,在转向contrib包之前,检查一下是否可以使用基本的R功能完成这一点通常不是一个坏主意。
因此,是否可以使用基本R功能对类POSIXct
的日期进行舍入?
我检查了
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"
我知道这可以通过timeDate,lubridate等来完成,但我想保持包依赖关系。所以在继续检查相应软件包的源代码之前,我想我会问有人已经做过这样的事情。
答案 0 :(得分:41)
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"
答案 1 :(得分:14)
在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"
答案 2 :(得分:1)
如果您不想调用外部库并且希望像我一样保留POSIXct
,这是一个主意(受this question的启发):使用strptime粘贴一个假的月份和日期。如this comment
“对于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"