R语言入门——日期的处理(二)

本文深入探讨R语言中日期处理的高级技巧,包括POSIXct与POSIXlt的区别、任意格式时间的转换、时间差的计算及泛型函数的应用。通过实例讲解,提升读者在复杂场景下处理日期数据的能力。

0引言

R语言入门——日期的处理(一)1中介绍了R语言中处理日期的常识,lubridate包,但是上面的这些介绍往往在实际的应用中还是不太够用。本文继续介绍R语言中的日期处理函数,以应对不同场景下的工作任务。
阅读本文你将会获得一下技能:

  • 了解POSIXct和POSIXlt的区别
  • 转化任意固定格式的时间
  • 计算时间差
  • 时间的泛型函数的查看

1、POSIXct和POSIXlt的区别

在介绍这个函数是先介绍一下两个函数:classunclassclass是获取函数的类、unclass是去掉函数的类。具体的涉及到泛型函数的知识详情可以参考R语言进阶——泛型函数的编写与提取案例2
先给出两个例子在具体说明这个两个时间类型的区别:

> (x <- as.POSIXct("1970/01/01 8:00:00")) # 赋值并输出
[1] "1970-01-01 08:00:00 CST"
> (y <- as.POSIXlt("1970/01/01 8:00:00"))
[1] "1970-01-01 08:00:00 CST"
> class(x)
[1] "POSIXct" "POSIXt" 
> class(y)
[1] "POSIXlt" "POSIXt" 

顺便提一下:1970-01-01 8:00:00是R语言的整数存储日期的开始。上面两个函数转换的时间数据是具有双类的,但是从类上还是可以看出区别的。下面去掉类然后观察他们的区别:

> unclass(x)
[1] 0
attr(,"tzone")
[1] ""
> unclass(y)
$sec
[1] 0
$min
[1] 0
$hour
[1] 8
$mday
[1] 1
$mon
[1] 0
$year
[1] 70
$wday
[1] 4
$yday
[1] 0
$isdst
[1] 0
$zone
[1] "CST"
$gmtoff
[1] NA

可以看出POSIXct是整数存储、POSIXlt是列表存储。具体的输出参数含义可以运行?DateTimeClasses进行查看。

2、转化任意固定格式的时间

在文献1中我们介绍的一般的时间格式的转化,但是很多的时间会在其他的固定格式中,这时我们应该怎么办。format参数可以帮助我们解决这个问题。
先看看as.POSIXct函数的内置参数:

as.POSIXlt(x, tz = "", format,
           tryFormats = c("%Y-%m-%d %H:%M:%OS",
                          "%Y/%m/%d %H:%M:%OS",
                          "%Y-%m-%d %H:%M",
                          "%Y/%m/%d %H:%M",
                          "%Y-%m-%d",
                          "%Y/%m/%d"),
           optional = FALSE, ...)

接着是例子:

> x <- "女朋友和我打算在2022年3月14日11点30分25秒举行婚礼"
> as.Date(x,format = "女朋友和我打算在%Y年%m月%d日%H点%M分%S秒举行婚礼")
[1] "2022-03-14"
> as.POSIXct(x,format = "女朋友和我打算在%Y年%m月%d日%H点%M分%S秒举行婚礼")
[1] "2022-03-14 11:30:25 CST"

具体公式的使用规则见附录。

3、计算时间差

时间差的计算是经常遇到的,我们一般可以使用-来运算比如下面:

> t1 <- as.Date("2020/04/25")
> t2 <- as.Date("2020/05/26")
> t2 - t1
Time difference of 31 days

上面的运算默认输出的是天数差。但是很多时候我们先要的却只是年数,也有可能想要秒数。这是就需要下面的函数了difftime。先给出参数:

> difftime
function (time1, time2, tz, units = c("auto", "secs", 
    "mins", "hours", "days", "weeks")) 

下面是具体的例子:

> difftime(t2,t1,units = "auto")
Time difference of 31 days
> difftime(t2,t1,units = "secs")
Time difference of 2678400 secs
> difftime(t2,t1,units = "mins")
Time difference of 44640 mins
> difftime(t2,t1,units = "hours")
Time difference of 744 hours
> difftime(t2,t1,units = "days")
Time difference of 31 days
> difftime(t2,t1,units = "weeks")
Time difference of 4.428571 weeks

4、时间的泛型函数

除了上面的函数还有一些泛型函数,我们可以通过methods2参数去查看函数内容,或者有无时间或者日期类型的泛型函数。下面这些函数都有:seq、rep、mean、summary等等常用的这里就不一一演示,大家用到去泛型函数的读帮助文件。

5、附录

时间的公式汇总表格

公式含义
%Y/%y年 %Y是四位数(2020) %y是两位数(20)
%m月十二进制
%d
H时24进制
%M分 60进制
%S
%a %A英文的周几
%b %B英文下的月份

6、参考文献


  1. https://blog.csdn.net/weixin_46111814/article/details/105171017 ↩︎ ↩︎

  2. https://blog.csdn.net/weixin_46111814/article/details/105624660 ↩︎ ↩︎

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计学小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值