0引言
在R语言入门——日期的处理(一)1中介绍了R语言中处理日期的常识,lubridate包,但是上面的这些介绍往往在实际的应用中还是不太够用。本文继续介绍R语言中的日期处理函数,以应对不同场景下的工作任务。
阅读本文你将会获得一下技能:
- 了解POSIXct和POSIXlt的区别
- 转化任意固定格式的时间
- 计算时间差
- 时间的泛型函数的查看
1、POSIXct和POSIXlt的区别
在介绍这个函数是先介绍一下两个函数:class和unclass。class是获取函数的类、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 | 英文下的月份 |
本文深入探讨R语言中日期处理的高级技巧,包括POSIXct与POSIXlt的区别、任意格式时间的转换、时间差的计算及泛型函数的应用。通过实例讲解,提升读者在复杂场景下处理日期数据的能力。
1万+

被折叠的 条评论
为什么被折叠?



