使用lubridate处理日期时间
Try to learn everything about something!
R语言的日期和时间问题很复杂,各种转换和计算、解析等都有明确的要求,而且由于格式复杂,经常会遇到各种问题。
lubridate
包是专门用来处理日期时间数据的,涉及转换、解析、计算等多种功能。
要想完全搞明白R语言里面的日期时间实在不是简单的事情,除了搞懂R里面的格式和各种函数的用法外,还要充分了解各种地理知识!比如时区、自然年、ISO年、国际日期变更线、闰年、闰月、夏令时、冬令时、时间的加减等。
简介
解析date-time
常用解析函数
例子
其他例子
获取和设定成分
对日期时间取约数
简介
date-time
以秒为单位,类似于:2022-03-13 12:09:10 UTC
library(lubridate)
##
## 载入程辑包:'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
dt <- as_datetime(2211870400) # 从1970-01-01 00:00:00开始算经过了多少秒
dt
## [1] "2040-02-03 08:26:40 UTC"
date
以天为单位,也是自1970年1月1日开始
d <- as_date(18090)
d
## [1] "2019-07-13"
time
以秒为单位,没有日期,只有时分秒
t <- hms::as_hms(85)
t
## 00:01:25
解析date-time
可用于把字符串(string)或者数值(number)转化为date-time类型。
识别数据中的年、月、日、时、分、秒 使用以下函数识别不同顺序的date-time,每个函数都可以接受 tz
参数用于设置时区
常用解析函数
y、m、d、h、m、s分别代表年、月、日、时、分、秒,字母的顺序就代表你的数据中日期时间的顺序。
ymd_hms()
ymd_hm()
ymd_h()
ydm_hms()
ydm_hm()
ydm_h()
mdy_hms()
mdy_hm()
mdy_h()
dmy_hms()
dmy_hm()
dmy_h()
ymd()
ydm()
mdy()
myd()
dmy()
dym()
yq()
:q代表季节
my()
ym()
从以上函数相信你应该可以看出:
不能是单独的几月几日,例如3-13
这种,是识别不了的!
对于解析日期来说,如果是字符型,默认的分隔符是/
或者-
,其他的分隔符都不能识别!
例子
下面是一些正确解析的例子,什么样的数据就要使用什么样的函数,错了就无法识别!
# 常见格式
ymd_hms("2017-11-28T12:00:00")
## [1] "2017-11-28 12:00:00 UTC"
ymd_hms("2022-02-12 13:21:45")
## [1] "2022-02-12 13:21:45 UTC"
ymd_hm("2022-02-13 14:00")
## [1] "2022-02-13 14:00:00 UTC"
ymd_h("2022/01/23 13")
## [1] "2022-01-23 13:00:00 UTC"
mdy_hm("03/11/2021 12:23")
## [1] "2021-03-11 12:23:00 UTC"
# 英文也是可以的
dmy_hms("1 Jan 2017 23:12:34") # 月份首字母大小写都可以
## [1] "2017-01-01 23:12:34 UTC"
mdy("july 4th, 2022") #4或者4th都可以
## [1] "2022-07-04"
dmy("4th of July 2020")
## [1] "2020-07-04"
# 从数值解析
ymd(20220216)
## [1] "2022-02-16"
mdy(03122022)
## [1] "2022-03-12"
# 季节
yq("2022:Q2") #q或者Q都可以
## [1] "2022-04-01"
其他例子
如果是以小数点分割的年月类型,且是数值型,也是可以解析的:
date_decimal(2022.3)
## [1] "2022-04-20 11:59:59 UTC"
date_decimal(2022.03)
## [1] "2022-01-11 22:47:59 UTC"
快速获取当前的日期和时间:
now()
## [1] "2022-04-01 15:48:15 CST"
today()
## [1] "2022-04-01"
快速解析日期时间:
# 基于C写的,解析速度快,数据量大时才能体现,这3个函数用法基本一样
fast_strptime()
parse_date_time()
parse_date_time2()
下面是用于解析多个时间日期的函数,在日常接触到的数据中,这几个函数才是最常用的也是最好用的。
# 多个字符
x <- c("09-01-01", "09-01-02", "09-01-03")
parse_date_time(x, "ymd")
## [1] "2009-01-01 UTC" "2009-01-02 UTC" "2009-01-03 UTC"
parse_date_time(x, "y m d")
## [1] "2009-01-01 UTC" "2009-01-02 UTC" "2009-01-03 UTC"
parse_date_time(x, "%y%m%d")
## [1] "2009-01-01 UTC" "2009-01-02 UTC" "2009-01-03 UTC"
## 多种格式
x <- c("09-01-01", "090102", "09-01 03", "09-01-03 12:02")
parse_date_time(x, c("ymd", "ymd HM"))
## [1] "2009-01-01 00:00:00 UTC" "2009-01-02 00:00:00 UTC"
## [3] "2009-01-03 00:00:00 UTC" "2009-01-03 12:02:00 UTC"
## 顺序不一样
x <- c("2009-01-01", "02022010", "02-02-2010")
parse_date_time(x, c("dmY", "ymd"))
## [1] "2009-01-01 UTC" "2010-02-02 UTC" "2010-02-02 UTC"
## 格式不全,可使用truncated参数解决
x <- c("2011-12-31 12:59:59", "2010-01-01 12:11", "2010-01-01 12", "2010-01-01")
parse_date_time(x, "Ymd HMS", truncated = 3)
## [1] "2011-12-31 12:59:59 UTC" "2010-01-01 12:11:00 UTC"
## [3] "2010-01-01 12:00:00 UTC" "2010-01-01 00:00:00 UTC"
## 指定顺序,使用exact参数
parse_date_time(x, c("%m-%d-%y", "%m%d%y", "%m-%d-%y %H:%M"), exact = TRUE) # 解析失败,因为顺序不一样
## [1] NA NA NA NA
parse_date_time(c('12/17/1996 04:00:00','4/18/1950 0130'),
c('%m/%d/%Y %I:%M:%S','%m/%d/%Y %H%M'), exact = TRUE) # 顺序一样解析成功
## [1] "1996-12-17 04:00:00 UTC" "1950-04-18 01:30:00 UTC"
## 含有季节
parse_date_time(c("2016.2", "2016-04"), orders = "Yq")
## [1] "2016-04-01 UTC" "2016-10-01 UTC"
parse_date_time(c("2016", "2016-04"), orders = c("Y", "Ym"))
## [1] "2016-01-01 UTC" "2016-04-01 UTC"
获取和设定成分
可用于提取日期时间类型的特定成分,比如提取年、月、日、时、分、秒等;也可单独改变这些成分。
主要包括以下函数
x <- "2022-01-23 14:23:09"date(x) # 获取日期## [1] "2022-01-23"year(x) # 获取年## [1] 2022isoyear(x)## [1] 2022epiyear(x)## [1] 2022month(x) # 获取月## [1] 1day(x)## [1] 23wday(x) # 一周中的第几天## [1] 1qday(x) # 一个季度中的第几天## [1] 23hour(x)## [1] 14minute(x)## [1] 23second(x)## [1] 9tz(x) # 获取时区## [1] "UTC"week(x) # 一年中的第几周## [1] 4isoweek(x)## [1] 3epiweek(x)## [1] 4quarter(x) # 一年中的第几季## [1] 1semester(x) # 上半年还是下半年## [1] 1am(x)## [1] FALSEpm(x)## [1] TRUEdst(x) # 是不是夏令时## [1] FALSEleap_year(x) # 是不是闰年!## [1] FALSE
对日期时间取约数
x <- ymd_hms("2017-11-28 12:00:00")floor_date(x, unit = "month")## [1] "2017-11-01 UTC"floor_date(x, unit = "day")## [1] "2017-11-28 UTC"round_date(x) # 四舍五入## [1] "2017-11-28 12:00:00 UTC"ceiling_date(x) # 取小## [1] "2017-11-28 12:00:00 UTC"
lubridate
包还有一块很重要的内容是日期时间的计算,不过由于在我的日常工作中用得不多,还没有仔细学习过,以后再说!
以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发!
欢迎在评论区留言或直接添加我的微信!
欢迎关注公众号:医学和生信笔记
“医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!
往期回顾
2022-02-08
2022-02-09
2022-02-10
2022-02-11