感谢您的反馈,并为造成的混乱感到抱歉,我已对其进行了一些编辑以澄清。
新编辑:
首先,chron 包和具有固定格式的strptime 都可以很好地工作,如其他答案所示。我只想简单介绍一下lubridate,因为它更容易使用,而且时间格式也很灵活。
示例数据
df <- data.frame(TimeEnterChar = c(rep("07:58", 10), "08:02", "08:03", "08:05", "08:10", "09:00"),
TimeExitChar = c("16:30", "16:50", "17:00", rep("17:02", 10), "17:30", "18:59"),
stringsAsFactors = F)
如果你只想计算8:00之后的进入时间,那么你可以直接比较字符。下面应该会晚 5 个进入时间。
sum(df$TimeEnterChar > "08:00")
如果您想要更多,就个人而言,我喜欢 lubridate 包处理时间数据,尤其是带有日期的时间戳,尽管它根本不是本文的重点。
library(lubridate)
# Convert character to a "Period" class by lubridate, shows in form of H M S
df$TimeEnterTime <- hm(df$TimeEnterChar)
df$TimeExitTime <- hm(df$TimeExitChar)
head(df)
sum(df$TimeEnterTime > hm("08:00"))
你仍然可以比较时间。
关于将它们用作数字的更多信息:
我假设只需要分钟级的时间。因此,我将秒数除以 60 得到分钟数。
df$DurationMinute <- as.numeric( df$TimeExitTime - df$TimeEnterTime )/60
hist(df$DurationMinute, breaks = seq(500, 600, 5))
head(df)
TimeEnterChar TimeExitChar TimeEnterTime TimeExitTime DurationMinute
1 07:58 16:30 7H 58M 0S 16H 30M 0S 512
2 07:58 16:50 7H 58M 0S 16H 50M 0S 532
3 07:58 17:00 7H 58M 0S 17H 0M 0S 542
4 07:58 17:02 7H 58M 0S 17H 2M 0S 544
5 07:58 17:02 7H 58M 0S 17H 2M 0S 544
6 07:58 17:02 7H 58M 0S 17H 2M 0S 544
您可以简单地绘制直方图来查看进入和退出之间的持续时间分布。
您还可以查看进入/退出时间的分布。但是转换轴需要一些努力。
df$TimeEnterNumMin <- as.numeric(df$TimeEnterTime) / 60
df$TimeExitNumMin <- as.numeric(df$TimeExitTime) / 60
hist(df$TimeEnterNumMin, breaks = seq(0, 1440, 60), xaxt = 'n', main = "Whole by 1hr")
axis(side = 1, at = seq(0, 1440, 60), labels = paste0(seq(0, 24, 1), ":00"))
hist(df$TimeEnterNumMin, breaks = seq(420, 600, 15), xaxt = 'n', main = "Morning by 15min")
axis(side = 1, at = seq(420, 600, 60), labels = paste0(seq(7, 10, 1), ":00"))
我没有润色情节,也没有使轴灵活。请根据您的需要做。希望对您有所帮助。
下面是旧的无用帖子:(无需阅读。保留,以免 cmets 看起来很奇怪)
遇到了类似的问题,并受到这篇文章的启发。 @G。 Grothendieck 和@David Arenburg 为改变时代提供了很好的答案。
为了比较,我觉得将时间强制转换为数字会有所帮助。与其比较"11:22:33" 和"9:00:00",不如比较as.numeric(hms("11:22:33"))(即40953 秒)和as.numeric(hms("9:00:00"))(32400)会容易得多。
as.numeric(hms("11:22:33")) > as.numeric(hms("9:00:00")) & as.numeric(hms("11:22:33")) < as.numeric(hms("17:00:00"))
[1] TRUE
以上示例显示 11:22:33 介于上午 9 点和下午 5 点之间。
要从日期或 POSIXct 对象中提取时间,substr("2013-10-01 11:22:33 UTC", 12, 19) 应该可以工作,尽管将时间对象更改为字符串/字符并再次返回时间看起来很愚蠢。
将时间转换为数字应该可以绘制为@G。格洛腾迪克描述道。您可以根据 x 轴标签的需要将数字转换回时间。