4

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

有人建议我在这里手动转换分钟和小时,方法是将数字分开,转换成相似的单位,然后添加。但是我很挣扎,因为早上 5 点只是被导入为 5。

如果有人能建议我如何正确地做到这一点,我将非常感激。

4

1 回答 1

5

有许多日期和时间的转换工具,以及一整套可供使用的软件包。我喜欢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替代功能包
  • 更多替代功能的timeDate
  • ...
于 2013-02-08T15:09:46.387 回答