RNotes-lubridate
RNotes-lubridate
lubridate中所有解析函数都会返回POSIXct日期,默认都是用UTC时区。lubridate包主要有两类函数,一类是处理时点数据(time instants), 另一类是处理时段数据(time spans)
#安装和载入lubridate包
install.packages("lubridate")
library(lubridate)
系统的当前时间lubridate::now(),和Sys.time()函数返回的时间相同
系统的当前日期lubridate::today(),和Sys.Date()函数返回的日期相同
now()
# Sys.time()
today()
# Sys.Date()
[1] "2021-11-18 21:13:00 CST"
2021-11-18
解析日期与时间
lubriadate非常灵活,它可以“智能”的判断我们的输入格式,最好的得到标准的时间格式,甚至即使你的输入不完全,通过一个truncated选项, 也可以识别不完整信息的日期输入格式。
ymd(20170629)
myd(06201729)
dmy(29062017)
test_date <- ymd_hms("2017-06-29-12-01-30", tz = "Pacific/Auckland")
test_date
[1] "2017-06-29 12:01:30 NZST"
test_date<- c(20170601, "2017-06-02", "2017 06 03", "2017-6-4","2017-6, 5", "Created on 2017 6 6", "201706 !!! 07")
ymd(test_date)
2017-06-01
2017-06-02
2017-06-03
2017-06-04
2017-06-05
2017-06-06
2017-06-07
test_date <- c('20131113','120315','12/17/1996','09-01-01','2015 12 23','2009-1, 5','Created on 2013 4 6')
parse_date_time(test_date,order = c('ymd','mdy','dmy','ymd'))
[1] "2013-11-13 UTC" "2015-12-03 UTC" "1996-12-17 UTC" "2009-01-01 UTC"
[5] "2015-12-23 UTC" "2009-01-05 UTC" "2013-04-06 UTC"
lubridate从字符串转换为日期类型
ymd()函数用于从字符型数据解析时间,该函数会自动识别各种分隔符
函数的定义是:ymd(…,quiet = FALSE,tz=NULL)
参数注释
-
quiet:布尔型,当指定为TRUE时,移除文本中自定义的文本 ;
-
tz: 时区,默认为NULL;
-
ymd代表文本的格式必须依次是;year、month、day
-
除了ymd外还有ydm,mdy,myd,dmy,dym。
x <- ymd("2010-04-09")
x
str(x)
Date[1:1], format: "2010-04-09"
设置与提取信息
抽取或设置时间部分。date:抽取或设置时间的日期,类似的还有year,month,day ,week,hour,minute,second
x <- ymd("2010-04-09")
date(x)
month(x)
day(x)
4
9
设置当前时间月份为6月
x
month(x) <- 6
x
模糊提取(取整)
test_date <- as.POSIXct("2017-06-29 12:34:59")
round_date(test_date,'hour') # 四舍五入取整
ceiling_date(test_date,'hour') # 向上取整
floor_date(test_date,'hour') # 向下取整
[1] "2017-06-29 13:00:00 CST"
[1] "2017-06-29 13:00:00 CST"
[1] "2017-06-29 12:00:00 CST"
三个函数 (处理时区信息)
- tz: 提取数据数据的时区 tz(today())
- with_tz:将时间数据转换为另一个时区的同一时间,时间值改变但是时间不变
- force_tz;将时间数据的时区强制转换为另一个时区,时间值不变但是时间会变
times <- now(tzone = "UTC")
with_tz(times,tz="America/Chicago")
times
[1] "2021-11-18 07:16:11 CST"
[1] "2021-11-18 13:16:11 UTC"
时间的运算
lubridata还能创建两类对象:期间(Duration)和周期(Period),创建period的辅助函数是unit+s,创建duration的辅助函数是d+unit+s,unit是时间单位,常用的时间单位有:year、month、week、day、hour、minute和second。期间指定的时间跨度为秒的倍数,是固定的秒数。例如,一天的总时间是86 400秒(60 x 60 x 24),一年的总时间是86 400 x 365 (秒),期间类型把一年的天数固定为365天,没有考虑闰年。
周期period根据日历来指定时间阔度,这意味着,在把周期添加到一个时间之前,period的确切的时间跨度是不固定的。例如,一年的周期可以是365天,也可以是366天,这取决于它是否是闰年。时间和日期的算术运算,跟期间和周期有关系,经常用到的是周期period类型。
- 常用的duration类的函数有:duration(num = NULL, units = “seconds”, …)
- 常用的period类的函数有:period(num = NULL, units = “second”, …)
duration | period |
---|---|
- is.duration(x) | is.period(x) |
- dseconds(x = 1) | seconds(x = 1) |
- dminutes(x = 1) | minutes(x = 1) |
- dhours(x = 1) | hours(x = 1) |
- ddays(x = 1) | days(x = 1) |
- dweeks(x = 1) | weeks(x = 1) |
- dyears(x = 1) | years(x = 1) |
- | months(x) |
# 对时间加上期间和周期,返回的结果是不同的:
ymd(20120101) + dyears(1)
ymd(20120101) + years(1)
ymd(20120101) + months(1)
ymd(20120101) + days(1)
[1] "2012-12-31 06:00:00 UTC"
2013-01-01
2012-02-01
2012-01-02
test_date <- test_date + weeks(0:5)
test_date
[1] "2017-06-29 12:34:59 CST" "2017-07-06 12:34:59 CST"
[3] "2017-07-13 12:34:59 CST" "2017-07-20 12:34:59 CST"
[5] "2017-07-27 12:34:59 CST" "2017-08-03 12:34:59 CST"
%m+%
在时间计算时,由于日期数据的特殊性,如果我们需要得到每个月的最后一天的日期数据,直接在某一个月的最后一天上加上月份很明显是错误的。
test_date_0 <- as.Date('2015-01-31')
test_date_2 <- test_date_0 %m+% months(0:11)
test_date_2
2015-01-31
2015-02-28
2015-03-31
2015-04-30
2015-05-31
2015-06-30
2015-07-31
2015-08-31
2015-09-30
2015-10-31
2015-11-30
2015-12-31