从lubridate日期时间对象中提取时间(HMS)?

15
我有以下日期时间:

t <- "2018-05-01 23:02:50 UTC"

我想将它分割成时间和日期。
当我使用date(t)时,我获得了日期部分。 但是,当我使用lubridate的、和其他函数以<“HMS”>顺序执行此操作时,会得到。
我已经检查了SOF上的其他答案,但出于某种原因它给我。
请指导如何提取它。
我想了解为什么:
strftime(t, format="%H:%M:%S") 

使用lubridate::hms或者parse_date_time都可以完成工作,但我缺少什么?

7个回答

17

这是您在寻找的内容吗?现在可以使用hms::as_hms更简单地完成。

> library(lubridate)
> library(hms)
> as_hms(ymd_hms("2018-05-01 23:02:50 UTC"))
23:02:50

> t <- "2018-05-01 23:02:50 UTC"
> as_hms(ymd_hms(t))
23:02:50

7

我的解决方案是安装library(anytime)

date <- anytime::anydate(t)
time <- strftime(t, format="%H:%M:%S")

6
你在 lubridate 中使用 hms() 函数时需要传入 "一个由小时、分钟和秒组成的字符串向量" 作为参数,如果传入包含日期信息的字符串,则无法处理。因此,Sys.Date()lubridate::now() 的输出不能作为 lubridate::hms() 的输入。

如果你想要一个 tidyverse 解决方案,可以尝试以下方法:

library(tidyverse)
library(lubridate)

now()
#> [1] "2018-08-13 16:41:31 BST"

get_time <- function(time = now()) {
  time %>%
    str_split(" ") %>%
    map_chr(2) %>%
    hms()
}

get_time()
#> [1] "16H 41M 31S"

get_time("2018-05-01 23:02:50 UTC")
#> [1] "23H 2M 50S"

这段内容是由reprex package (v0.2.0)于2018年08月13日创建的。


1
像这样的东西?
  library(hms)
    t <- "2018-05-01 23:02:50 UTC"
    unlist(strsplit(t," "))[2]%>%hms::parse_hms()

1

以下是一种解决方案,无需引入其他包(在lubridate之上的hms):

t <- "2018-05-01 23:02:50 UTC"

sprintf("%02d:%02d:%02d", hour(t), minute(t), second(t))

"23:02:50"

0

发布一个我用来在 lubridate 转换后独立提取 ymd 或 hms 的解决方案。我注意到 OP 提到想要分离时间和日期,因此为了未来可能会来到这里的 SO 用户,我在下面包含了用于两者的正则表达式。假设 df 包含一个名为 date 的列,其中时间格式为 ymd_hms,如下所示:"2018-05-01 23:02:50 UTC"

library(stringr)
df <- df %>%
   mutate(
    time = str_extract(date, "[0-9]{2}:[0-9]{2}:[0-9]{2}") #to extract hms time
    day = str_extract(date, "[0-9]{4}-[0-9]{2}-[0-9]{2}") #to extract ymd time
)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接