5.1 base R

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

5.1.1 Date

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

class(Sys.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日")

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

2.日期计算

两日期之间间隔

date1 - date2
difftime(date1,date2,units = 'days')

日期加减天数

date1 - 4

date2 + 4

向量化计算

three_date <- as.Date(c('2021-05-01','2021-05-05','2021-05-10'))
diff(three_date)

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

3.创建日期向量

date3 <- as.Date('2020-01-01')
date4 <- as.Date('2021-01-01')
date_col <- date3:date4
head(date_col)

以上方式创建日期向量会数字化,正确方式如下所示:

# seq(date3,date4)
seq(date3,date4,by="30 days")
seq(date3,date4,by="8 weeks")

5.1.2 POSIXct

如果在数据中有时间,最好使用该类;

Sys.time() #获取当前时间
class(Sys.time())

1.创建POSIXct类

tm1 <- as.POSIXct("2021-5-19 16:05:45")
tm1
tm2 <- as.POSIXct("19052021 16:05:45",format = "%d%m%Y %H:%M:%S")
tm2
# 比较是否相同
identical(tm1,tm2)

2.时区

时区如果不正确指定,将导致我们在做时间计算时可能出现错误,一般相差8小时,因为我们在东八区。

默认时区

Sys.timezone()
as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT') #不知道什么原因 CST需要变成CST6CDT不会报错
as.POSIXct("2021-5-19 16:05:45",tz = 'GMT') - as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT')
as.POSIXct("2021-5-19 16:05:45",tz = 'UTC') - as.POSIXct("2021-5-19 16:05:45",tz = 'CST6CDT')

3.计算

比较

tm1 <- as.POSIXct("2021-5-19 16:05:45") 
tm2 <- as.POSIXct("2021-5-19 16:15:45") 
tm2 > tm1

加减计算,默认单位秒

tm1 + 300
tm2 - 300
tm2 - tm1

5.1.3 POSIXlt

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

创建时间

t1 <- as.POSIXlt('2021-5-19 16:05:45')
t1
unclass(t1)

提取

t1$mday
t1$wday

截断

trunc(t1,'day')
trunc(t1,'min')

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