将字符串变量(例如“815”)重新编码为R中的时间变量(08:15)

将字符串变量(例如“815”)重新编码为R中的时间变量(08:15),r,datetime,R,Datetime,我正在寻找帮助,使用r将字符串变量重新编码为正确格式的时间变量。我有一周内约450人的每日日记数据。他们自我报告了他们的睡眠和醒来时间,我试图用这些数据做两件事:1)观察一周中睡眠和醒来时间的变化,2)计算“睡眠时间”;在这些睡眠时间和醒来时间之间经过的小时数 我的问题是找到重新格式化数据的方法。床和醒时间目前是字符串变量,hh和mm之间没有冒号(“815”表示上午8:15;“2345”表示下午11:45;“15”表示上午12:15”)。我不一定关心在那里设置AM/PM,如果所有内容都被重新设置

我正在寻找帮助,使用r将字符串变量重新编码为正确格式的时间变量。我有一周内约450人的每日日记数据。他们自我报告了他们的睡眠和醒来时间,我试图用这些数据做两件事:1)观察一周中睡眠和醒来时间的变化,2)计算“睡眠时间”;在这些睡眠时间和醒来时间之间经过的小时数

我的问题是找到重新格式化数据的方法。床和醒时间目前是字符串变量,hh和mm之间没有冒号(“815”表示上午8:15;“2345”表示下午11:45;“15”表示上午12:15”)。我不一定关心在那里设置AM/PM,如果所有内容都被重新设置为“23:45”之类的格式就好了

我不知道哪种软件包/功能/创造性解决方案最有助于解决这一问题。我确实看到了chron或lubridate之类的软件包,但这些函数似乎对我的第二个问题更有帮助,即计算两个变量之间的时间差。但是我确实需要帮助将这个字符串变量重新编码为可用的东西


谢谢你的建议和帮助

我们可以填充0使宽度为4,然后使用
as.ITime
转换为时间类

library(stringr)
library(data.table)
out <- as.ITime(str_replace(str_pad("815", width = 4, pad = 0), "(\\d{2})", "\\1:"))
str(out)
#'ITime' int 08:15:00
out
#[1] "08:15:00"

假设我们有以下时间:


你有字符串“815”还是“815 AM”@RuiBarradas。很抱歉,无法复制此问题。可能是任何语言环境问题。但是如果我改为
sprintf(“%04d”,815)
它就可以工作了。我看看会发生什么。@RuiBarradas可能是
r3.6.2
(我正在使用该版本)中的一些行为改变,效果非常好!!非常感谢。
strptime(sub("(\\d{2})", "\\1:", sprintf("%04s", "815")), format = '%H:%M')
#[1] "2020-02-15 08:15:00 EST"
as_time <- function(t) gsub("(^\\d:)", "0\\1", gsub("(\\d{2}$)", ":\\1", t))
as_time(times)
#> [1] "03:45" "06:00" "11:59" "15:02" "23:59"