在 R 中转换自定义数据类型和/计算持续时间

Convert custom data type &/ calculating duration in R

我已经从使用自定义数据格式 ##d:##h:##m:##s(天:小时:分钟:秒)的特定工具下载了报告。它作为因子/字符串导入到 R。如何将其转换为持续时间。与其说是数据类型,不如说是计算。数据框为 367x58。 367个元素的时间不尽相同(大部分以小时、分钟和秒为单位;少数以天为单位)。

输入:

> # Converting Date/Time

dput(head(AS_1.2$Open_for)) structure(c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), .Label = c("01d:07h:45m:55s", "01d:11h:02m:36s", "01d:23h:26m:01s", "01m:07s", "01m:10s", "01m:12s", "01m:15s", "01m:23s", "01m:27s", "01m:32s", "01m:42s", "01m:43s", "01m:44s", "01m:45s", "02d:21h:14m:52s", "02h:06m:37s", "02h:09m:35s", "02h:25m:34s", "02h:51m:50s", "02m:04s", "02m:09s", "02m:18s", "02m:44s", "02s", "03d:05h:29m:14s", "03d:09h:16m:32s", "03h:41m:59s", "03h:43m:19s", "03m:08s", "03m:12s", "03m:21s", "03m:23s", "03m:24s", "03m:28s", "03m:33s", "03m:38s", "03m:44s", "03m:46s", "03m:48s", "03m:53s", "03m:57s", "03s", "04d:01m:53s", "04d:07h:40m:40s", "04d:19h:31m:30s", "04h:23m:45s", "04m:03s", "04m:09s", "04m:16s", "04s", "05d:22h:59m:24s", "05d:23h:18m:25s", "05m:27s", "05m:36s", "05m:38s", "05m:41s", "05s", "06d:12h:38m:51s", "06d:12h:46m:17s", "06d:12h:53m:11s", "06d:13h:03m:29s", "06d:13h:15m:29s", "06d:13h:46m:12s", "06m:09s", "06m:30s", "06s", "07d:03h:09m:39s", "07d:19h:08m:31s", "07s", "08s", "09m", "09m:29s", "09m:39s", "11m:44s", "11s", "12d:23h:04m:24s", "13s", "14s", "17s", "18m:46s", "18s", "19h", "20h:19m:39s", "20m:33s", "20m:49s", "20s", "21m:17s", "21s", "22m:06s", "25s", "26s", "27m:22s", "38s", "39s", "45s", "46s", "50s", "51m:23s" ), class = "factor") ?dput()

预期产出(以小时为单位):

对于第一个元素 => 01d:07h:45m:55s = 175.7653 小时

如果我们只是稍微格式化一下数据,lubridate 库可以帮助解决这个问题。 lubridate 要求大写 "H"、"M"、"S" 表示小时、分钟和秒;小写 "m" 被解释为一个月。

所以我们可以做到

library(lubridate)
x <- c("01d:07h:45m:55s", "01d:11h:02m:36s", "01d:23h:26m:01s", "01m:07s")
cleaned <- gsub("([hms])", "\U\1", x, perl=TRUE) # upper case the h, m and s
duration(cleaned)
# [1] "114355s (~1.32 days)" "126156s (~1.46 days)" "170761s (~1.98 days)"
# [4] "67s (~1.12 minutes)" 
as.numeric(duration(cleaned), units="hours")
# [1] 31.76527778 35.04333333 47.43361111  0.01861111