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

解析日期与时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6FFM9jJ-1640433790174)(attachment:image.png)]

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”, …)
durationperiod
- 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值