gpt4 book ai didi

r - 如何在 R 中比较和处理时间

转载 作者:行者123 更新时间:2023-12-04 09:30:26 25 4
gpt4 key购买 nike

我需要一些帮助来比较 R 中的两次时间。目前我有一列格式为 HH:%M %p 的导入数据(例如 03:15 PM,而不是 3:15 PM)。我需要创建一个新列并标记时间在上午 10:00 之前的任何行。

我已经在互联网上搜索并一直盯着类似的解决方案,但似乎无法让它发挥作用。

任何帮助将不胜感激!谢谢!

最佳答案

更新

这是一个清晰的更新,展示了使用 data.table::as.ITime 的简洁方式。它几乎结合了 dickoa 的回答、Frank 的评论和我的回答以获得最佳结果。

library(data.table)
#example vector
vec <- c('09:00 PM', '11:00 PM', '09:00 AM')
#format can be used in the same way as in POSIXct
as.ITime(vec, format = "%I:%M %p") < as.ITime('10:00')
[1] FALSE FALSE TRUE

#notice that as.ITime does not create dates (alongside the times) as POSIX** does
#It only deals with times
#> as.ITime(vec, format = "%I:%M %p")
#[1] "21:00:00" "23:00:00" "09:00:00"

或者按照 Frank 的以下评论使用 data.table:

ivec <- as.ITime(vec)
setDT(list(ivec))[, V1 := as.ITime(vec, "%I:%M %p")]

原始答案

#using safe.ifelse to keep attributes
#function borrowed from here:
#http://stackoverflow.com/questions/6668963/how-to-prevent-ifelse-from-turning-date-objects-into-numeric-objects
safe.ifelse <- function(cond, yes, no){ class.y <- class(yes)
X <- ifelse(cond,yes,no)
class(X) <-class.y; return(X)}


library(data.table)
#example vec
vec <- c('09:00 PM', '11:00 PM', '09:00 AM')
#convert them to time using as.ITime from data.table and safe.ifelse
#basically I use safe.ifelse to detect PM in the vec
#if there is a PM then I convert that to an 24-hour time by adding 12 hours
new_vec <- safe.ifelse(grepl('PM', vec), as.ITime(vec) + 12*3600, as.ITime(vec))

> new_vec
[1] "21:00:00" "23:00:00" "09:00:00"

最后与 10:00 AM 进行比较

> new_vec < as.ITime('10:00')
[1] FALSE FALSE TRUE

或者正如@Frank 在评论中提到的那样,因为 vec 是您的 data.frame 中的一列,这可能是一种更好的方法(并且您不需要使用 safe.ifelse) :

ivec <- as.ITime(vec)
setDT(list(ivec))[grepl('PM', vec), V1 := V1 + 12L*3600L ]

在看到@dickoa 的回答后,他的回答似乎有一种格式,也适用于 as.ITime:

vec     <- c('09:00 PM', '11:00 PM', '09:00 AM')
> as.ITime(vec, "%I:%M %p")
[1] "21:00:00" "23:00:00" "09:00:00"

这意味着一个简单的:

ivec <- as.ITime(vec)
setDT(list(ivec))[, V1 := as.ITime(vec, "%I:%M %p")]

就够了。因此,IMO 我们的答案(和@Frank 的评论)的组合可能是最好的解决方案(as.ITime 不会创建 strptime 所做的日期)。

关于r - 如何在 R 中比较和处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33526399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com