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
,halfyear
和year
。period()
构造函数中允许使用任意唯一的英文缩写。支持四舍五入到单位的倍数(周除外)。当unit
是Period
对象时,使用周期对象的单位。这相当于将 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
相同类和相同时区的日期时间对象。
日期对象的四舍五入
默认情况下,对 Date
对象进行舍入遵循 3 个步骤:
-
转换为表示日期下限的瞬间:
2000-01-01
-->2000-01-01 00:00:00
-
向上舍入到下一个最接近的舍入单位边界。例如,如果舍入单位是
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
设置为TRUE
或FALSE
来更改边界上的行为。 -
如果舍入单位小于一天,则返回步骤 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 lubridate rollbackward 向后或向前滚动上个月、当前或下个月的日期
- R lubridate DateTimeUpdate 更改日期对象的组成部分
- R lubridate stamp 基于人性化模板设置日期和时间格式
- R lubridate interval 用于创建和操作 Interval 对象的实用程序
- R lubridate is.difftime x 是 difftime 对象吗?
- R lubridate as_date 将对象转换为日期或日期时间
- R lubridate date 获取/设置日期时间的日期部分
- R lubridate make_difftime 创建一个 difftime 对象。
- R lubridate is.timespan x 是时间长度吗?
- R lubridate with_tz 获取不同时区的日期时间
- R lubridate mplus 在日期中添加和减去月份,但不超过新月份的最后一天
- R lubridate cyclic_encoding 日期时间的循环编码
- R lubridate as.interval 将对象更改为间隔
- R lubridate second 获取/设置日期时间的秒部分
- R lubridate quarter 获取日期时间的财政季度和学期
- R lubridate posix_utils 各种 POSIX 实用程序
- R lubridate date_decimal 将小数转换为日期
- R lubridate as.duration 将对象更改为持续时间
- R lubridate hour 获取/设置日期时间的小时部分
- R lubridate minute 获取/设置日期时间的分钟部分
- R lubridate month 获取/设置日期时间的月份部分
- R lubridate duration 创建一个持续时间对象。
- R lubridate leap_year 一年是闰年吗?
- R lubridate local_time 从日期时间向量获取当地时间。
- R lubridate make_datetime 从数字表示高效创建日期时间
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Round, floor and ceiling methods for date-time objects。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。