当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R lubridate round_date 日期时间对象的舍入、取整和取整方法


round_date() 接受日期时间对象和时间单位,并将其舍入为指定时间单位的最接近值。对于恰好位于两个连续单位中间的日期时间的舍入,惯例是向上舍入。请注意,这与 R 的 base::round.POSIXt() 函数的行为一致,但不遵循基本 base::round() 函数的约定,即根据 IEC 60559“四舍五入到偶数位”。

支持舍入到最接近的单位或单位的倍数。支持英语中所有有意义的规范 - 秒、分钟、分钟、2 分钟、3 年等。

还支持舍入到小数秒。请注意,由于 POSIXct 对象的浮点表示形式,四舍五入到小于 1 秒的分数可能会导致较大的精度误差。请参阅示例。

floor_date() 接受一个日期时间对象并将其向下舍入到指定时间单位的最近边界。

ceiling_date() 接受一个日期时间对象并将其向上舍入到指定时间单位的最近边界。

用法

round_date(
  x,
  unit = "second",
  week_start = getOption("lubridate.week.start", 7)
)

floor_date(
  x,
  unit = "seconds",
  week_start = getOption("lubridate.week.start", 7)
)

ceiling_date(
  x,
  unit = "seconds",
  change_on_boundary = NULL,
  week_start = getOption("lubridate.week.start", 7)
)

参数

x

日期时间对象的向量

unit

字符串、Period 对象或日期时间对象。当为单例字符串时,它指定要舍入的时间单位或单位的倍数。有效的基本单位是 second , minute , hour , day , week , month , bimonth , quarter , season , halfyearyearperiod() 构造函数中允许使用任意唯一的英文缩写。支持四舍五入到单位的倍数(周除外)。当unitPeriod 对象时,使用周期对象的单位。这相当于将 period 对象转换为其字符串表示形式并作为 unit 参数传递。

unit 是日期时间对象时,将四舍五入到 unit 中最接近的元素。如果 unit 向量的范围不覆盖 x 的范围,则 ceiling_date()floor_date() 舍入到 max(x)min(x) 中超出 range(unit) 的元素。

week_start

周开始日(默认为 7,周日。设置lubridate.week.start 进行覆盖)。一周中各天的完整或缩写名称可以是英文或由当前区域设置提供。

change_on_boundary

如果这是NULL(默认),边界上的时刻保持不变,但是Date对象向上舍入到下一个边界。如果这是TRUE,边界上的时刻向上舍入到下一个边界。如果这是FALSE,边界上的任何内容都不会被舍入。这是默认值润滑之前v1.6.0。参见部分Rounding Up Date Objects请参阅下文了解更多详情。

unit是字符串时,如果x是Date并且unit大于或等于"day",则返回Date对象,否则返回POSIXct对象。当 unit 是日期时间对象时,返回与 unit 相同类和相同时区的日期时间对象。

细节

润滑,舍入日期时间对象的函数会尽可能保留输入对象的类。这是通过首先舍入到瞬间,然后按照通常的 R 约定转换为原始类来完成的。

日期对象的四舍五入

默认情况下,对 Date 对象进行舍入遵循 3 个步骤:

  1. 转换为表示日期下限的瞬间:2000-01-01 --> 2000-01-01 00:00:00

  2. 向上舍入到下一个最接近的舍入单位边界。例如,如果舍入单位是 month,则 2000-01-01 的下一个最接近边界是 2000-02-01 00:00:00

    这样做的动机是 "partial" 2000-01-01 在概念上是一个间隔 ( 2000-01-01 00:00:00 -- 2000-01-02 00:00:00 ) 并且这一天尚未在确切的边界 00:00:00 开始计时。因此,将一天舍入到其下限似乎是错误的。

    可以通过将 change_on_boundary 设置为 TRUEFALSE 来更改边界上的行为。

  3. 如果舍入单位小于一天,则返回步骤 2 中的时刻 ( POSIXct ),否则转换为并返回 Date 对象。

也可以看看

例子


## print fractional seconds
options(digits.secs = 6)

x <- ymd_hms("2009-08-03 12:01:59.23")
round_date(x, ".5s")
#> [1] "2009-08-03 12:01:59 UTC"
round_date(x, "sec")
#> [1] "2009-08-03 12:01:59 UTC"
round_date(x, "second")
#> [1] "2009-08-03 12:01:59 UTC"
round_date(x, "minute")
#> [1] "2009-08-03 12:02:00 UTC"
round_date(x, "5 mins")
#> [1] "2009-08-03 12:00:00 UTC"
round_date(x, "hour")
#> [1] "2009-08-03 12:00:00 UTC"
round_date(x, "2 hours")
#> [1] "2009-08-03 12:00:00 UTC"
round_date(x, "day")
#> [1] "2009-08-04 UTC"
round_date(x, "week")
#> [1] "2009-08-02 UTC"
round_date(x, "month")
#> [1] "2009-08-01 UTC"
round_date(x, "bimonth")
#> [1] "2009-09-01 UTC"
round_date(x, "quarter") == round_date(x, "3 months")
#> [1] TRUE
round_date(x, "halfyear")
#> [1] "2009-07-01 UTC"
round_date(x, "year")
#> [1] "2010-01-01 UTC"

x <- ymd_hms("2009-08-03 12:01:59.23")
floor_date(x, ".1s")
#> [1] "2009-08-03 12:01:59.2 UTC"
floor_date(x, "second")
#> [1] "2009-08-03 12:01:59 UTC"
floor_date(x, "minute")
#> [1] "2009-08-03 12:01:00 UTC"
floor_date(x, "hour")
#> [1] "2009-08-03 12:00:00 UTC"
floor_date(x, "day")
#> [1] "2009-08-03 UTC"
floor_date(x, "week")
#> [1] "2009-08-02 UTC"
floor_date(x, "month")
#> [1] "2009-08-01 UTC"
floor_date(x, "bimonth")
#> [1] "2009-07-01 UTC"
floor_date(x, "quarter")
#> [1] "2009-07-01 UTC"
floor_date(x, "season")
#> [1] "2009-06-01 UTC"
floor_date(x, "halfyear")
#> [1] "2009-07-01 UTC"
floor_date(x, "year")
#> [1] "2009-01-01 UTC"

x <- ymd_hms("2009-08-03 12:01:59.23")
ceiling_date(x, ".1 sec") # imprecise representation at 0.1 sec !!!
#> [1] "2009-08-03 12:01:59.2 UTC"
ceiling_date(x, "second")
#> [1] "2009-08-03 12:02:00 UTC"
ceiling_date(x, "minute")
#> [1] "2009-08-03 12:02:00 UTC"
ceiling_date(x, "5 mins")
#> [1] "2009-08-03 12:05:00 UTC"
ceiling_date(x, "hour")
#> [1] "2009-08-03 13:00:00 UTC"
ceiling_date(x, "day")
#> [1] "2009-08-04 UTC"
ceiling_date(x, "week")
#> [1] "2009-08-09 UTC"
ceiling_date(x, "month")
#> [1] "2009-09-01 UTC"
ceiling_date(x, "bimonth") == ceiling_date(x, "2 months")
#> [1] TRUE
ceiling_date(x, "quarter")
#> [1] "2009-10-01 UTC"
ceiling_date(x, "season")
#> [1] "2009-09-01 UTC"
ceiling_date(x, "halfyear")
#> [1] "2010-01-01 UTC"
ceiling_date(x, "year")
#> [1] "2010-01-01 UTC"

## Period unit argument
floor_date(x, days(2))
#> [1] "2009-08-03 UTC"
floor_date(x, years(1))
#> [1] "2009-01-01 UTC"

## As of R 3.4.2 POSIXct printing of fractional numbers is wrong
as.POSIXct("2009-08-03 12:01:59.3") ## -> "2009-08-03 12:01:59.2 CEST"
#> [1] "2009-08-03 12:01:59.2 UTC"
ceiling_date(x, ".1 sec") ## -> "2009-08-03 12:01:59.2 CEST"
#> [1] "2009-08-03 12:01:59.2 UTC"

## behaviour of `change_on_boundary`
## As per default behaviour `NULL`, instants on the boundary remain the
## same but dates are rounded up
ceiling_date(ymd_hms("2000-01-01 00:00:00"), "month")
#> [1] "2000-01-01 UTC"
ceiling_date(ymd("2000-01-01"), "month")
#> [1] "2000-02-01"

## If `TRUE`, both instants and dates on the boundary are rounded up
ceiling_date(ymd_hms("2000-01-01 00:00:00"), "month", change_on_boundary = TRUE)
#> [1] "2000-02-01 UTC"
ceiling_date(ymd("2000-01-01"), "month")
#> [1] "2000-02-01"

## If `FALSE`, both instants and dates on the boundary remain the same
ceiling_date(ymd_hms("2000-01-01 00:00:00"), "month", change_on_boundary = FALSE)
#> [1] "2000-01-01 UTC"
ceiling_date(ymd("2000-01-01"), "month")
#> [1] "2000-02-01"

x <- ymd_hms("2000-01-01 00:00:00")
ceiling_date(x, "month")
#> [1] "2000-01-01 UTC"
ceiling_date(x, "month", change_on_boundary = TRUE)
#> [1] "2000-02-01 UTC"

## For Date objects first day of the month is not on the
## "boundary". change_on_boundary applies to instants only.
x <- ymd("2000-01-01")
ceiling_date(x, "month")
#> [1] "2000-02-01"
ceiling_date(x, "month", change_on_boundary = TRUE)
#> [1] "2000-02-01"
源代码:R/round.r

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Round, floor and ceiling methods for date-time objects。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。