Round a POSIX date (POSIXct) with base R functionality

前端 未结 3 776
隐瞒了意图╮
隐瞒了意图╮ 2020-12-03 04:25

I\'m currently playing around a lot with dates and times for a package I\'m building.

Stumbling across this post reminded me again that it\'s generally not a bad ide

相关标签:
3条回答
  • 2020-12-03 04:57

    If you don't want to call external libraries and want to keep POSIXct as I do this is one idea (inspired by this question): use strptime and paste a fake month and day. It should be possible to do it more straight forward, as said in this comment

    "For strptime the input string need not specify the date completely: it is assumed that unspecified seconds, minutes or hours are zero, and an unspecified year, month or day is the current one."

    Thus it seems that you have to use strftime to output a truncated string, paste the missing part and convert again in POSIXct.

    This is how an update answer could look:

    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"
    
    0 讨论(0)
  • 2020-12-03 04:59

    base has round.POSIXt to do this. Not sure why it doesn't come up with 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"
    
    0 讨论(0)
  • 2020-12-03 05:09

    On this theme with lubridate, also look into the ceiling_date() and floor_date() functions:

    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"
    
    0 讨论(0)
提交回复
热议问题