R中一列中的小时和分钟

时间:2013-02-08 14:59:19

标签: r

我有一个简单的数据框。我想从中添加另一列记录时间(小时和分钟,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。

如果有人能告诉我如何正确地做到这一点,我会非常感激。

1 个答案:

答案 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用于更多替代功能
  • ...