将数字转换为时间

时间:2014-01-08 18:26:34

标签: r time

我手工输入了数据,为了节省时间,我的时间里没有包含任何标点符号。所以,例如,8:32 am我输入为832. 3:34 pm我输入为1534.我正在尝试使用R中的'chrono'包(http://cran.r-project.org/web/packages/chron/chron.pdf)将这些转换为时间格式,但是时间似乎需要小时和分钟值之间的分隔符。我该如何解决这个问题或使用其他包将我的数字转换成次数?

如果你想批评我提出之前已经回答过的问题,请提供一个回答所说答案的链接,因为我已经搜索过但无法找到它。然后批评走了。

5 个答案:

答案 0 :(得分:6)

我认为你不一定需要chron包。当:

x  <-  c(834, 1534)

然后:

time <- substr(as.POSIXct(sprintf("%04.0f", x), format='%H%M'), 12, 16)
time

[1] "08:34" "15:34"

应该给你想要的结果。如果您还想包含一个代表日期的变量,您可以使用以下代码:

df$datetime <- as.POSIXct(paste(df$yymmdd, sprintf("%04.0f", df$x)), format='%Y%m%d %H%M%S')

答案 1 :(得分:4)

这是使用正则表达式的sub解决方案:

set.seed(1); times <- paste0(sample(0:23,10), sample(0:59,10)) # ex. data
sub("(\\d+)(\\d{2})", "\\1:\\2", times) # put in delimitter
# [1] "6:12"  "8:10"  "12:39" "19:21" "4:43"  "17:27" "18:38" "11:52" "10:19" "0:57" 

答案 2 :(得分:2)

x  <-  c('834', '1534')

最后两个字符代表分钟,因此您可以使用

提取它们
mins  <-  substr(x, nchar(x)-1, nchar(x))

同样,用

提取小时数
hour  <-  substr(x, 0, nchar(x)-2)

然后用

创建一个固定的时间值向量
time  <-  paste0(hour, ':', mins)

我认为你被迫在chron包中指定日期,所以假设一个日期值,你可以用这个转换为chron:

chron(dates.=rep('02/02/02', 2), 
      times.=paste0(hour, ':', mins, ':00'), 
      format=c(dates='m/d/y',times='h:m:s'))

答案 3 :(得分:2)

我以为我会抛弃一个使用lubridate的非正则表达式解决方案。这可能有点过头了。

library(lubridate)
library(stringr)

time.orig <- c('834', '1534')

# zero pad times before noon
time.padded <- str_pad(time.orig, 4, pad="0")

# parse using lubridate
time.period <- hm(time.padded)

# make it look like time
time.pretty <- paste(hour(time.period), minute(time.period), sep=":")

你最终得到了

> time.pretty
[1] "8:34"  "15:34"

答案 4 :(得分:1)

以下是两个不使用正则表达式的解决方案:

library(chron)
x <- c(832, 1534, 101, 110) # test data

# 1
times( sprintf( "%d:%02d:00", x %/% 100, x %% 100 ) )

# 2
times( ( x %/% 100 + x %% 100 / 60 ) / 24 )

要么提供以下chron "times"对象:

[1] 08:32:00 15:34:00 01:01:00 01:10:00

ADDED 第二个解决方案。