如何将SQL间隔作为字符串转换为lubridate持续时间?

如何将SQL间隔作为字符串转换为lubridate持续时间?,r,lubridate,R,Lubridate,我得到了一个字符向量,如(它是对区间类型列执行SQL选择的结果): 我需要将其转换为lubridate duration对象。如果没有天,我可以使用hms()函数来完成。当向量中有天数时,我该怎么做呢?我的解决方案有点复杂。我认为快速的答案是有一种方法可以通过lubridate实现这一点。但是,您需要做一些工作来将字符串转换为正确的格式。其思想是使用regex和stringr()将信息转换为可用的格式,然后将数据转换为句点格式 test <-c("00:01:13","00:00:33",

我得到了一个字符向量,如(它是对区间类型列执行SQL选择的结果):


我需要将其转换为lubridate duration对象。如果没有天,我可以使用
hms()
函数来完成。当向量中有天数时,我该怎么做呢?

我的解决方案有点复杂。我认为快速的答案是有一种方法可以通过
lubridate
实现这一点。但是,您需要做一些工作来将字符串转换为正确的格式。其思想是使用regex和
stringr()
将信息转换为可用的格式,然后将数据转换为
句点
格式

test <-c("00:01:13","00:00:33","00:08:23","00:00:13",
         "5 days 22:07:16", "00:01:04","00:00:14","00:05:22")
test_df <- data.frame(time = test)

这是否符合需要

我始终建议尽可能使用ISO 8601格式。如果您可以将查询更改为以这种格式返回数据,则可以随后使用
lubridate::as.period()
将R中的字符转换为句点

例如,在postgres中,您可以在事务中执行以下操作:

BEGIN;

SET LOCAL intervalstyle = 'iso_8601';
SELECT (INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second')::text;

COMMIT;
它将返回一个明确且易于解析的ISO 8601字符串:

P6Y5M4DT3H2M1S

可以先使用
sub
删除“天”。类似于
sub(“^\\d+days”,”,myVec)
。我正在寻找一个函数,它可以让我将所有这样的字符串转换为持续时间,并正确地包括“days”部分。如果lubridate或其他包中没有任何东西,我将不得不自己实现一些东西。
test_df <- test_df %>% 
 mutate(time = paste(hour, minute, second)) %>% 
 mutate(time = hms(time)) %>% 
 mutate(time = time + days(day))
BEGIN;

SET LOCAL intervalstyle = 'iso_8601';
SELECT (INTERVAL '6 years 5 months 4 days 3 hours 2 minutes 1 second')::text;

COMMIT;
P6Y5M4DT3H2M1S
> lubridate::as.period("P6Y5M4DT3H2M1S")
[1] "6y 5m 4d 3H 2M 1S"