【上一篇:61.关于调整因子的属性levels的值】
【下一篇:63.关于date-time组件的获得与更改】
在R中创建日期和时间实际上是生成固定日期和时间格式的字符串。R中固定日期和时间格式为:年-月-日 时:分:秒 时区,下文统一称为"R时间"。
我们可以从字符串(人的习惯造成的差异)创建R时间,也可以从组成部件创建R时间,还可以做date和date-time的转换。
日期和时间分:date、time和date-time。
从字符串创建日期
前面学习过用readr包中的parse_*系列函数处理,本篇讲用
lubridate包中的函数解决问题。lubridate不是tidyverse的核心包,所以你只需要用到它的时候library一下就可以了。hms包(记忆:hour minute second)用于处理时间。
# 获得今天的日期
> today()
# 获得当前的时间
> now()
这两个函数都只有一个时区参数:tzone
lubridate包中的一系列Parse dates with year, month, and day components函数的名字是y、m、d三个字母的自由排列组合,所以共有6种三字母函数:ymd()、ydm()、myd()、mdy()、dym()、dmy()。另外还有两字母函数:yq()(年和季度)、ym()、my()。
这些函数将存储在字符或数字向量种的日期时间信息转换成R时间。这些函数可以识别任意的非数字分隔符以及无分隔符。只要格式的顺序正确,这些函数就能正确地解析日期,即使输入向量包含不同格式的日期。这些函数的Usage都一样:
ymd(
...,
quiet = FALSE,
tz = NULL,
locale = Sys.getlocale("LC_TIME"),
truncated = 0
)
> ymd("2017-01-31")
[1] "2017-01-31"
> mdy("January 31st, 2017")
[1] "2017-01-31"
> dmy("31-Jan-2017")
[1] "2017-01-31"
# 没有分割符的情况
> dmy(010210)
[1] "2010-02-01"
# 2014年的第2个季度
> yq('2014.2')
[1] "2014-04-01"
从字符串创建日期+时间
Parse date-times with year, month, and day, hour, minute, and second components的函数也是一个家族。函数名字的格式是在上述函数的后面加下划线和h、m、s组合的字母(包括hms、hm和h)。此家族的函数处理非字母数字分割的字符或数字向量。
# Usage
ymd_hms(
...,
quiet = FALSE,
tz = "UTC",
locale = Sys.getlocale("LC_TIME"),
truncated = 0
)
> ymd_hms("2017-01-31 20:11:59")
[1] "2017-01-31 20:11:59 UTC"
> mdy_hm("01/31/2017 08:01")
[1] "2017-01-31 08:01:00 UTC"
从component创建日期+时间
有两个函数:make_datetime()和make_date(),Usage为:
make_datetime(
year = 1970L,
month = 1L,
day = 1L,
hour = 0L,
min = 0L,
sec = 0,
tz = "UTC"
)
make_date(year = 1970L, month = 1L, day = 1L)
# 用法示例
> make_datetime(year = 1999, month = 12, day = 22, sec = 10)
[1] "1999-12-22 00:00:10 UTC"
> make_datetime(year = 1999, month = 12, day = 22, sec = c(10, 11))
[1] "1999-12-22 00:00:10 UTC" "1999-12-22 00:00:11 UTC"
日期时间和日期之间的转换
有两个函数:as_datetime()和as_date()。这两个函数的输入是一个POSIXt向量。
R中有两个基本date/times class:POSIXt和POSIXct,前者是一个指定的表示向量的列表,后者代表从1970年开始的秒数。
这两个函数的输入除了字符串想来之外,还可以是用day或second表示的offset:
# 如果offset是秒,则用as_datetime
> as_datetime(60 * 60 * 10)
[1] "1970-01-01 10:00:00 UTC"
# 如果offset是day,则用as_date
> as_date(365 * 10 + 2)
[1] "1980-01-01"