【问题标题】:Round a POSIX date (POSIXct) with base R functionality使用基本 R 功能对 POSIX 日期 (POSIXct) 进行舍入
【发布时间】:2012-07-04 18:05:26
【问题描述】:

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

偶然发现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"

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

【问题讨论】:

    标签: r date datetime rounding posixct


    【解决方案1】:

    baseround.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"
    

    【讨论】:

    • 很棒的功能,但奇怪的是没有周、月或年的舍入;对于我的情况,我将不得不使用@nzcoops 回答
    • 此外,round 将 POSIXct 转换为 POSIXlt - 这有时可能是个问题。
    • ...如果需要,可以通过将输出包装在as.POSIXct() 中来解决。
    【解决方案2】:

    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"
    

    【讨论】:

    • 我希望月舍入可用于 POSIXct,因为 floor_date 非常缓慢。
    • 问题明确指出“我知道这可以通过 timeDate、lubridate 等来完成,但我想降低包依赖关系。”。
    【解决方案3】:

    如果您不想调用外部库并想像我一样保留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"
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2014-11-15
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多