5.1 base R
R中内置Date,POSIXct和POSIXlt三个关于日期和时间的类9。
5.1.1 Date
如果我们的数据结构中只有日期,没有时间,我们仅需要使用Date类。
class(Sys.Date())
#> [1] "Date"
1.创建日期
<- as.Date('2021-05-18')
date1 # as.Date(32768, origin = "1900-01-01")
# date1 <- as.Date('2021-05-18',origin = "1900-01-01")
当日期字符不规则时必须指定format参数
<- as.Date("5/14/2021",format="%m/%d/%Y") date2
想想如何才将将“2021年5月8日”转换成日期:
as.Date("2021年5月18日",format="%Y年%m月%d日")
#> [1] "2021-05-18"
重点是时间的format,详情可以通过?strptime()
查看。
2.日期计算
两日期之间间隔
- date2
date1 #> Time difference of 4 days
difftime(date1,date2,units = 'days')
#> Time difference of 4 days
日期加减天数
- 4
date1 #> [1] "2021-05-14"
+ 4
date2 #> [1] "2021-05-18"
向量化计算
<- as.Date(c('2021-05-01','2021-05-05','2021-05-10'))
three_date diff(three_date)
#> Time differences in days
#> [1] 4 5
在计算顾客购物间隔天数时比较有用。
3.创建日期向量
<- as.Date('2020-01-01')
date3 <- as.Date('2021-01-01')
date4 <- date3:date4
date_col head(date_col)
#> [1] 18262 18263 18264 18265 18266 18267
以上方式创建日期向量会数字化,正确方式如下所示:
# seq(date3,date4)
seq(date3,date4,by="30 days")
#> [1] "2020-01-01" "2020-01-31" "2020-03-01" "2020-03-31" "2020-04-30"
#> [6] "2020-05-30" "2020-06-29" "2020-07-29" "2020-08-28" "2020-09-27"
#> [11] "2020-10-27" "2020-11-26" "2020-12-26"
seq(date3,date4,by="8 weeks")
#> [1] "2020-01-01" "2020-02-26" "2020-04-22" "2020-06-17" "2020-08-12"
#> [6] "2020-10-07" "2020-12-02"
5.1.2 POSIXct
如果在数据中有时间,最好使用该类;
Sys.time() #获取当前时间
#> [1] "2021-06-23 18:15:26 CST"
class(Sys.time())
#> [1] "POSIXct" "POSIXt"
1.创建POSIXct类
<- as.POSIXct("2021-5-19 16:05:45")
tm1
tm1#> [1] "2021-05-19 16:05:45 CST"
<- as.POSIXct("19052021 16:05:45",format = "%d%m%Y %H:%M:%S")
tm2
tm2#> [1] "2021-05-19 16:05:45 CST"
# 比较是否相同
identical(tm1,tm2)
#> [1] TRUE
2.时区
时区如果不正确指定,将导致我们在做时间计算时可能出现错误,一般相差8小时,因为我们在东八区。
默认时区
Sys.timezone()
#> [1] "Asia/Taipei"
as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT') #不知道什么原因 CST需要变成CST6CDT不会报错
#> [1] "2021-05-19 16:05:45 CDT"
as.POSIXct("2021-5-19 16:05:45",tz = 'GMT') - as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT')
#> Time difference of -5 hours
as.POSIXct("2021-5-19 16:05:45",tz = 'UTC') - as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT')
#> Time difference of -5 hours
3.计算
比较
<- as.POSIXct("2021-5-19 16:05:45")
tm1 <- as.POSIXct("2021-5-19 16:15:45")
tm2 > tm1
tm2 #> [1] TRUE
加减计算,默认单位秒
+ 300
tm1 #> [1] "2021-05-19 16:10:45 CST"
- 300
tm2 #> [1] "2021-05-19 16:10:45 CST"
- tm1
tm2 #> Time difference of 10 mins
5.1.3 POSIXlt
通过此类,我们可以很便捷提取时间中的特定成分。其中“ct”代表日历时间,“it”代表本地时间,该类对象是list(列表)。
创建时间
<- as.POSIXlt('2021-5-19 16:05:45')
t1
t1#> [1] "2021-05-19 16:05:45 CST"
unclass(t1)
#> $sec
#> [1] 45
#>
#> $min
#> [1] 5
#>
#> $hour
#> [1] 16
#>
#> $mday
#> [1] 19
#>
#> $mon
#> [1] 4
#>
#> $year
#> [1] 121
#>
#> $wday
#> [1] 3
#>
#> $yday
#> [1] 138
#>
#> $isdst
#> [1] 0
#>
#> $zone
#> [1] "CST"
#>
#> $gmtoff
#> [1] NA
提取
$mday
t1#> [1] 19
$wday
t1#> [1] 3
截断
trunc(t1,'day')
#> [1] "2021-05-19 CST"
trunc(t1,'min')
#> [1] "2021-05-19 16:05:00 CST"
类是面向对象编程的一个术语,一个对象通常有0个1个或多个类。在R中用
class()
函数查看所属对象的类。↩︎