我有一个简单的数据框。我想从中添加另一列记录时间(小时和分钟,24小时制)。然后我将针对变量绘制此列。由于日期都是一样的,我只对时间感兴趣。这是我到目前为止所尝试过的。
a <- c(1:6)
b <- c("05/12/2012 05:00","05/12/2012 06:55","05/12/2012 07:10",
"05/12/2012 10:23", "05/12/2012 11:43","05/12/2012 13:04")
c <-c("0","0","0","1","1","1")
df1 <- data.frame(a,b,c,stringsAsFactors = FALSE)
a <- df1$a
b <- strptime(df1$b, "%d/%m/%Y %H:%M")
c <- as.numeric(df1$c)
hour <- as.numeric(format(b, "%H"))
min <- as.numeric(format(b, "%M"))
date <- format(b, "%x")
time <- hour + min
df2 <- data.frame(a, b, c, hour, min, date, time)
我被告知here手动转换分钟和小时数,将数字分开,转换成类似的单位,然后添加。然而,我正在努力,因为早上5点只是导入为5。
如果有人能告诉我如何正确地做到这一点,我会非常感激。
答案 0 :(得分:4)
有许多日期和时间的转换工具,以及一整套要使用的包。在这种情况下,我喜欢使用POSIXlt
,因为您可以通过从列表中提取它们来提取您需要的任何信息。
例如:
a <- c(1:6)
b <- c("05/12/2012 05:00","05/12/2012 06:55","05/12/2012 07:10",
"05/12/2012 10:23", "05/12/2012 11:43","05/12/2012 13:04")
c <-c("0","0","0","1","1","1")
df1 <- data.frame(a,b,c,stringsAsFactors = FALSE)
df2 <- within(df1,{
posb <- as.POSIXlt(b,format="%d/%m/%Y %H:%M")
hours <- posb$hour
mins <- posb$min
dates <- format(posb, "%x")
time <- format(posb, "%H:%M")
posb <- NULL # cleanup
})
给出了:
> df2
a b c time dates mins hours
1 1 05/12/2012 05:00 0 05:00 12/5/2012 0 5
2 2 05/12/2012 06:55 0 06:55 12/5/2012 55 6
3 3 05/12/2012 07:10 0 07:10 12/5/2012 10 7
4 4 05/12/2012 10:23 1 10:23 12/5/2012 23 10
5 5 05/12/2012 11:43 1 11:43 12/5/2012 43 11
6 6 05/12/2012 13:04 1 13:04 12/5/2012 4 13
有关详细信息,请参阅:
?POSIXlt
了解有关POSIXt类的更多信息?format
了解有关格式化选项的更多信息?strptime
了解有关格式化选项和转换为字符的更多信息lubridate
package替代功能timeDate
package用于更多替代功能