从 lubridate 日期时间对象中提取时间(HMS)?
Extract time (HMS) from lubridate date time object?
我有以下日期时间:
t <- "2018-05-01 23:02:50 UTC"
我想把它拆分成时间和日期。
当我应用 date(t) 时,我得到了日期部分。
但是当我使用 lubridate 的 hms
、parse_date_time
和其他函数以 "HMS"
顺序执行此操作时,我得到 NA
.
我已经在 SOF 上检查了其他答案,但出于某种原因它给了我 NA
。
请指教如何提取。
我想知道为什么:
strftime(t, format="%H:%M:%S")
会完成这项工作,但我在 lubridate::hms
或 parse_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")
您在 lubridate
的 hms()
中缺少的是它期望 "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
这是一个不包含另一个包的解决方案(hms
在 lubridate
之上):
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
)
我有以下日期时间:
t <- "2018-05-01 23:02:50 UTC"
我想把它拆分成时间和日期。
当我应用 date(t) 时,我得到了日期部分。
但是当我使用 lubridate 的 hms
、parse_date_time
和其他函数以 "HMS"
顺序执行此操作时,我得到 NA
.
我已经在 SOF 上检查了其他答案,但出于某种原因它给了我 NA
。
请指教如何提取。
我想知道为什么:
strftime(t, format="%H:%M:%S")
会完成这项工作,但我在 lubridate::hms
或 parse_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")
您在 lubridate
的 hms()
中缺少的是它期望 "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
这是一个不包含另一个包的解决方案(hms
在 lubridate
之上):
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
)