5.1 base R

R中内置Date,POSIXct和POSIXlt三个关于日期和时间的类9

5.1.1 Date

如果我们的数据结构中只有日期,没有时间,我们仅需要使用Date类。

class(Sys.Date())
#> [1] "Date"

1.创建日期

date1 <- as.Date('2021-05-18')
# as.Date(32768, origin = "1900-01-01")
# date1 <- as.Date('2021-05-18',origin = "1900-01-01")

当日期字符不规则时必须指定format参数

date2 <- as.Date("5/14/2021",format="%m/%d/%Y")

想想如何才将将“2021年5月8日”转换成日期:

as.Date("2021年5月18日",format="%Y年%m月%d日")
#> [1] "2021-05-18"

重点是时间的format,详情可以通过?strptime()查看。

2.日期计算

两日期之间间隔

date1 - date2
#> Time difference of 4 days
difftime(date1,date2,units = 'days')
#> Time difference of 4 days

日期加减天数

date1 - 4
#> [1] "2021-05-14"

date2 + 4
#> [1] "2021-05-18"

向量化计算

three_date <- as.Date(c('2021-05-01','2021-05-05','2021-05-10'))
diff(three_date)
#> Time differences in days
#> [1] 4 5

在计算顾客购物间隔天数时比较有用。

3.创建日期向量

date3 <- as.Date('2020-01-01')
date4 <- as.Date('2021-01-01')
date_col <- date3:date4
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类

tm1 <- as.POSIXct("2021-5-19 16:05:45")
tm1
#> [1] "2021-05-19 16:05:45 CST"
tm2 <- as.POSIXct("19052021 16:05:45",format = "%d%m%Y %H:%M:%S")
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.计算

比较

tm1 <- as.POSIXct("2021-5-19 16:05:45") 
tm2 <- as.POSIXct("2021-5-19 16:15:45") 
tm2 > tm1
#> [1] TRUE

加减计算,默认单位秒

tm1 + 300
#> [1] "2021-05-19 16:10:45 CST"
tm2 - 300
#> [1] "2021-05-19 16:10:45 CST"
tm2 - tm1
#> Time difference of 10 mins

5.1.3 POSIXlt

通过此类,我们可以很便捷提取时间中的特定成分。其中“ct”代表日历时间,“it”代表本地时间,该类对象是list(列表)。

创建时间

t1 <- as.POSIXlt('2021-5-19 16:05:45')
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

提取

t1$mday
#> [1] 19
t1$wday
#> [1] 3

截断

trunc(t1,'day')
#> [1] "2021-05-19 CST"
trunc(t1,'min')
#> [1] "2021-05-19 16:05:00 CST"

  1. 类是面向对象编程的一个术语,一个对象通常有0个1个或多个类。在R中用class()函数查看所属对象的类。↩︎