12  日期和时间

TODO: 继续深入理解日期和时间。

日期时间通常以字符串的形式传入R中,然后转化为以数值形式储存的日期时间变量。

R的内部日期是以1970年1月1日1至今的天数来储存,内部时间则是以1970年1月1日至今的秒数来储存的。

lubridata包提供了一系列更方便的函数用来生成、管理日期。

不要直接按字符串处理日期时间,应该先转换为日期对象后在处理。

12.1 识别日期时间

  1. 识别当前时间
[1] "2026-04-23"
now()
[1] "2026-04-23 16:24:58 CST"
  1. 时间日期转换
# 将日期型转换为时间型
as_datetime(today())
[1] "2026-04-23 UTC"
# 将时间型转换为日期型
as_date(now())
[1] "2026-04-23"
注记

可根据需要使用 ymd_h/myd_hm/dmy_hms等任意组合识别日期时间值,使用参数tz可以指定时区。

ymd("20220301")
[1] "2022-03-01"
ymd_hms("20220301-131300")
[1] "2022-03-01 13:13:00 UTC"
  1. 创建时间日期
make_date(2020, 8, 27)
[1] "2020-08-27"
make_datetime(2020, 8, 27, 21, 27, 15)
[1] "2020-08-27 21:27:15 UTC"

12.2 格式化输出日期时间

  1. format()函数
d <- make_date(2022, 4, 22)
format(d, "%Y/%m/%d")
[1] "2022/04/22"
  1. stamp()函数,按给定模版的格式输出
t <- make_datetime(2022, 4, 22, 17, 34, 15)
fmt <- stamp("Created on Sunday, jan 1, 1999 3:34 pm") # 模版,自动匹配时间组件
fmt(t)
[1] "Created on Sunday, 04 22, 2022 17:34 pm"

12.3 提取日期时间数据的组建

时间组件、描述、示例
t <- ymd_hms("2022-04-22 17:41:45")
# 提取年份,类似的还有month()、day()、hour()、minute()、second()
year(t)
[1] 2022
# 提取季度
quarter(t)
[1] 2
# 计算时间是当年的第几天
yday(t)
[1] 112
# 关于星期
weekdays(t)
[1] "星期五"
wday(t) # 日期是本周的第几天,注意默认周日为第1天
[1] 6
wday(t, label = TRUE)
[1] 周五
Levels: 周日 < 周一 < 周二 < 周三 < 周四 < 周五 < 周六
week(t) # 本周是当年的第几周
[1] 16
注记
  1. 使用**_tz()函数修改时区:
  • tz()显示当前时区
  • with_tz()将时间数据转换为另一个时区的同一时间
  • force_tz()将时间数据的时区强制转换为另一个时区
tz(t)
[1] "UTC"
with_tz(t, tz = "America/New_York")
[1] "2022-04-22 13:41:45 EDT"
force_tz(t, tz = "America/New_York")
[1] "2022-04-22 17:41:45 EDT"
  1. 模糊提取到不同的时间单位,以下函数均需设定取整单位,默认为second
round_date(t, unit = "hour") # 按小时四舍五入取整
[1] "2022-04-22 18:00:00 UTC"
floor_date(t, unit = "hour")
[1] "2022-04-22 17:00:00 UTC"
ceiling_date(t, unit = "hour")
[1] "2022-04-22 18:00:00 UTC"

12.4 时间段数据

  1. interval()函数计算两个时间点的时间间隔,返回时间段数据。通常需要对时间段进行进一步识别。
begin <- ymd_hm("2019-08-10, 14:00")
end <- ymd_hm("2022-4-26, 9:10")
gap <- interval(begin, end)
gap # 返回时间段数据
[1] 2019-08-10 14:00:00 UTC--2022-04-26 09:10:00 UTC
# 计算时间段有几天,同理可以计算有几个月、几分钟等
time_length(gap, "day")
[1] 989.7986
  1. duration()函数和period()函数计算数值+时间单位存储时段的长度。 period()函数考虑到了闰年和闰秒,所以在国内更推荐使用。
period(100, units = "seconds") # 100天有多少秒、共几个星期
[1] "100S"
period(c(90, 5), c("second", "minute"))
[1] "5M 90S"

  1. 可以参考这篇文章了解有趣最初时间点设置。↩︎