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

Extract time (HMS) from lubridate date time object?

我有以下日期时间:

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

我想把它拆分成时间和日期。

当我应用 date(t) 时,我得到了日期部分。 但是当我使用 lubridate 的 hmsparse_date_time 和其他函数以 "HMS" 顺序执行此操作时,我得到 NA.

我已经在 SOF 上检查了其他答案,但出于某种原因它给了我 NA

请指教如何提取。

我想知道为什么:

strftime(t, format="%H:%M:%S") 

会完成这项工作,但我在 lubridate::hmsparse_date_time 中缺少什么?

是这样的吗?

  library(hms)
    t <- "2018-05-01 23:02:50 UTC"
    unlist(strsplit(t," "))[2]%>%hms::parse_hms()

我的解决办法是安装library(anytime):

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

您在 lubridatehms() 中缺少的是它期望 "a character vector of hour minute second triples" 作为参数。没有规定处理还包含日期信息的字符串。因此,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。

存在Lubridate包中的函数,叫做"hour()",这里是官方指南: https://lubridate.tidyverse.org/reference/hour

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

lubridate::hour(t)

这是您要找的吗?现在可以使用 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

这是一个不包含另一个包的解决方案(hmslubridate 之上):

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

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

"23:02:50"

发布我用来在 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
)