本章将会使用以下三个包:
> library(tidyverse)
> library(lubridate)
> library(nycflights13)
一、创建日期或时间
表示日期或时间的数据有三种:
日期:在tibble中显示为date。
时间:一天中的某个时刻,在tibble中显示为<time>。
日期时间:可以唯一标识某个时刻(通常精确到秒)的日期加时间,在tibble中显示为<dttm>。
得到当前日期或当前日期时间,可以使用today()或now()函数:
> today()
[1] "2021-11-09"
> now()
[1] "2021-11-09 12:26:29 CST"
以下有三种方法可以创建日期或时间:
1.通过字符串创建
如果确定了各个组成部分的顺序,那么这些函数可以自动将字符串转换为日期时间格式。
使用这些函数之前需要先确认年月日的排列顺序,然后按照同样的顺序排列y,m,d。
> ymd("2021-11-09")
[1] "2021-11-09"
> mdy("Nov 9th,2021")
[1] "2021-11-09"
> dmy("09-11-2021")
[1] "2021-11-09"
这些函数也可以接受不带引号的数值:
> ymd(20211109)
[1] "2021-11-09"
> mdy(11092021)
[1] "2021-11-09"
> dmy(09112021)
[1] "2021-11-09"
如果想要创建日期时间型数据,可以在ymd后面加一个下划线,再加入h,m,s的一个或多个字母。
> ymd_hms("2021-11-09 12:34:17")
[1] "2021-11-09 12:34:17 UTC"
> mdy_hm("11/09/2021 12:34")
[1] "2021-11-09 12:34:00 UTC"
通过添加一个时区参数,可以将日期强制转化为日期时间型数据:
> dmy(09112021,tz="UTC")
[1] "2021-11-09 UTC"
2.通过各个成分创建
除了单个字符串,日期时间数据的各个成分还经常分布在表格的多列,例如航班数据:
> flights %>% select(year,month,day,hour,minute)
# A tibble: 336,776 x 5
year month day hour minute
<int> <int> <int> <dbl> <dbl>
1 2013 1 1 5 15
2 2013 1 1 5 29
3 2013 1 1 5 40
4 2013 1 1 5 45
5 2013 1 1 6 0
6 2013 1 1 5 58
7 2013 1 1 6 0
8 2013 1 1 6 0
9 2013 1 1 6 0
10 2013 1 1 6 0
# ... with 336,766 more rows
可以使用make_date函数创建日期数据,make_datetime函数创建日期时间:
> flights %>% select(year,month,day,hour,minute) %>% mutate(departure=make_datetime(year,month,day,hour,minute))
# A tibble: 336,776 x 6
year month day hour minute departure
<int> <int> <int> <dbl> <dbl> <dttm>
1 2013 1 1 5 15 2013-01-01 05:15:00
2 2013 1 1 5 29 2013-01-01 05:29:00
3 2013 1 1 5 40 2013-01-01 05:40:00
4 2013 1 1 5 45 2013-01-01 05:45:00
5 2013 1 1 6 0 2013-01-01 06:00:00
6 2013 1 1 5 58 2013-01-01 05:58:00
7 2013 1 1 6 0 2013-01-01 06:00:00
8 2013 1 1 6 0 2013-01-01 06:00:00
9 2013 1 1 6 0 2013-01-01 06:00:00
10 2013 1 1 6 0 2013-01-01 06:00:00
# ... with 336,766 more rows
对flights的四个时间列(arr_time,dep_time,sched_dep_time,sched_arr_time)进行相同的操作。我们先对与time有关变量做处理,通过模运算将小时成分与分钟成分分离: