查看原文
其他

使用lubridate处理日期时间

阿越就是我 医学和生信笔记 2023-06-15
关注公众号,发送R语言,获取学习资料!

     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.生物信息学学习资料和自己的学习笔记!


往期回顾




R语言处理因子之forcats包介绍(1)

2022-02-08

R语言处理因子之forcats包介绍(2)

2022-02-09

R语言处理因子之forcats包介绍(3)

2022-02-10

R语言处理因子之forcats包介绍(4)

2022-02-11

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存