【发布时间】:2021-04-14 11:58:09
【问题描述】:
我有一列采用这种格式的时间:43:46:18,它显示 hh:mm:ss(h:小时,m:分钟,s: second),我想将此列转换为秒(或分钟),但是“:”是多余的,我不知道应该如何处理?
【问题讨论】:
-
问题应该提供测试数据。这次我在回答的备注中为您提供了这一点。
标签: r
我有一列采用这种格式的时间:43:46:18,它显示 hh:mm:ss(h:小时,m:分钟,s: second),我想将此列转换为秒(或分钟),但是“:”是多余的,我不知道应该如何处理?
【问题讨论】:
标签: r
1) 定义一个函数,将时间的 3 个部分分成 3 列的数据框,将其转换为矩阵,然后矩阵将其与 3 个分量为数字的向量相乘在一小时、一分钟和一秒中的秒数。最后使用 c(...) 将其从 nx1 矩阵转换为纯向量。
要进行测试,请将其应用于末尾注释中定义的测试数据dat 的时间列。没有使用任何包。
time2sec <- function(x) {
c(as.matrix(read.table(text = x, sep = ":")) %*% c(3600, 60, 1))
}
# test using dat from Note at the end
transform(dat, seconds = time2sec(time))
给予:
id time seconds
1 1 43:46:18 157578
2 2 43:46:18 157578
2) 另一种方法是将小时转换为 POSIXlt,然后将其转换为秒。这给出了与上面相同的结果。同样,没有使用任何包。
time2sec_2 <- function(x) {
with(as.POSIXlt(x, format = "%Y:%M:%S"), 3600 * (year + 1900) + 60 * min + sec)
}
transform(dat, seconds = time2sec_2(time))
dat <- data.frame(id = 1:2, time = "43:46:18")
【讨论】:
lubridate 包包含一些用于处理日期和时间的有用函数,特别是hms 对于以您的格式读取时间很有用。你可以这样使用:
library(lubridate)
as.numeric(hms("43:46:18"))
# [1] 157578 #Conversion to seconds
【讨论】: