我有一个R格式的数据集,其值为小时、分钟和秒格式。但是,有些值只有小时和分钟,有些只有分钟和秒,有些只有分,有些只有秒。它的格式也不太好。样本数据如下:
example <- as.data.frame(c("22h28m", "17m7s", "15m", "14s"))
我想把它转换成POSIXct格式,如下所示,目的是增加/减少时间:
列标题 |
---|
22:28:00 |
00:17:07 |
00:15:00 |
00:00:14 |
也许parse_date_time
来自lubridate
?
library("lubridate")
x <- c("22h28m", "17m7s", "15m", "14s")
y <- parse_date_time(x, orders = c("%Hh%Mm%Ss", "%Hh%Mm", "%Hh%Ss", "%Mm%Ss", "%Hh", "%Mm", "%Ss"), exact = TRUE)
y
## [1] "0000-01-01 22:28:00 UTC"
## [2] "0000-01-01 00:17:07 UTC"
## [3] "0000-01-01 00:15:00 UTC"
## [4] "0000-01-01 00:00:14 UTC"
要获取午夜后的秒数,可以执行以下操作:
y0 <- floor_date(y, unit = "day")
dy <- y - y0
dy
## Time differences in secs
## [1] 80880 1027 900 14
然后,您可以将dy
添加到指定为长度为1的POSIXct
对象的任何参考时间中。例如,当前时区中最近的午夜:
y0 <- floor_date(now(), unit = "day")
y0 + dy
## [1] "2022-02-03 22:28:00 EST"
## [2] "2022-02-03 00:17:07 EST"
## [3] "2022-02-03 00:15:00 EST"
## [4] "2022-02-03 00:00:14 EST"
更新
在更仔细地阅读了文档之后,我意识到lubridate
实现了一种直接获得dy
的方法。
dy <- duration(toupper(x))
dy
## [1] "80880s (~22.47 hours)" "1027s (~17.12 minutes)" "900s (~15 minutes)" "14s"
然后,您可以按照上面的方法执行y0 + dy
以获得POSIXct
对象,如果您愿意,还可以获得
strftime(y0 + dy, "%T")
## [1] "22:28:00" "00:17:07" "00:15:00" "00:00:14"
以获得列出没有日期或时区的时间的字符矢量。