存储没有日期但没有作为类字符的时间

时间:2014-10-31 17:40:43

标签: r datetime dataframe posixct

我的类字符数据框中有一个local.time列,其中包含如下元素:

> a$local.time
 [1] "1:30 AM"  "6:29 AM"  "6:59 AM"  "9:54 AM"  "10:14 AM" "10:34 AM" "12:54 PM" "1:15 PM"  "1:20 PM" 
 [10] "1:20 PM"  "2:15 PM"  "2:15 PM"  "4:23 AM"  "6:28 AM"  "2:45 PM"  "3:08 PM"  "3:23 PM"  "3:58 PM" 

我想将它们从类字符转换为时间变量。所以我用过:

> as.POSIXct(a$local.time, tz = "", format = "%I:%M %p", usetz = FALSE)

这导致:

[1] "2014-10-31 01:30:00 EDT" "2014-10-31 06:29:00 EDT" "2014-10-31 06:59:00 EDT" "2014-10-31       09:54:00 EDT"
[5] "2014-10-31 10:14:00 EDT" "2014-10-31 10:34:00 EDT" "2014-10-31 12:54:00 EDT" "2014-10-31 13:15:00 EDT"

我在不同的列中有一个日期变量,目的是提供按日期过滤和在动态仪表板中将时间段缩放到分钟的功能。

我想从$ local.time删除日期和时区,但保留时间格式,以便保持年表,即18:57是当天的第19小时和第57分钟等。

如果我使用

  

a$local.time <- format(a$local.time, "%Y-%m-%d %H:%M:%S", usetz = FALSE)   a$local.time <- strftime(a$local.time, format = "%H:%m")

班级改为角色!什么是正确的方法?

2 个答案:

答案 0 :(得分:5)

chron包中有一个“时间”类可能对您有所帮助。从与目前相似的东西开始:

x <- c("1:30 AM", "6:29 AM", "6:59 AM", "9:54 AM", "10:14 AM", "3:15 PM"))
a <- as.POSIXct(x, tz = "", format = "%I:%M %p", usetz = FALSE)

然后我们可以将times函数与format

一起使用
library(chron)
(tms <- times(format(a, "%H:%M:%S")))
# [1] 01:30:00 06:29:00 06:59:00 09:54:00 10:14:00 15:15:00
attributes(tms)
# $format
# [1] "h:m:s"
#
# $class
# [1] "times"

答案 1 :(得分:1)

您可以使用hms包中的lubridate(小时 - 分钟 - 秒)系列函数。

library(lubridate)

times = c("1:30 AM",  "6:29 AM",  "6:59 AM",  "9:54 AM", "2:45 PM")

我希望你能做到:

hm(times)
[1] "1H 30M 0S" "6H 29M 0S" "6H 59M 0S" "9H 54M 0S" "2H 45M 0S"

但请注意hm无法识别AM / PM的区别。因此,这是一个更复杂的方法,需要首先使用strptime,它识别AM / PM,然后将结果放入hm形式识别。

hm(paste0(hour(strptime(times, "%I:%M %p")),":",
          minute(strptime(times, "%I:%M %p"))))
[1] "1H 30M 0S"  "6H 29M 0S"  "6H 59M 0S"  "9H 54M 0S"  "14H 45M 0S"

可能有更好的方法,但这似乎有效。

更新:要解决您的评论,您可以使用hourminute功能获取小时和分钟(虽然我喜欢@ RichardScriven的回答更好)。例如:

hour(times)
[1]  1  6  6  9 14

mean(hour(times) + minute(times)/60)
[1] 7.923333