我手工输入了数据,为了节省时间,我的时间里没有包含任何标点符号。所以,例如,8:32 am我输入为832. 3:34 pm我输入为1534.我正在尝试使用R中的'chrono'包(http://cran.r-project.org/web/packages/chron/chron.pdf)将这些转换为时间格式,但是时间似乎需要小时和分钟值之间的分隔符。我该如何解决这个问题或使用其他包将我的数字转换成次数?
如果你想批评我提出之前已经回答过的问题,请提供一个回答所说答案的链接,因为我已经搜索过但无法找到它。然后批评走了。
答案 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 第二个解决方案。