R语言字符转带时分的日期格式及计算时间差问题
解决方案
完整实现代码
# 若未安装lubridate包,先执行:install.packages("lubridate") library(lubridate) # 原始数据 start <- c("2022-01-10 9:35PM","2022-01-10 10:35PM") end <- c("2022-01-11 7:00AM","2022-01-11 8:00AM") dat <- data.frame(start,end) # 1. 转换为24小时制的日期时间格式 dat$start_dt <- mdy_hm(dat$start) dat$end_dt <- mdy_hm(dat$end) # 2. 计算时间差(小时为单位) dat$diff <- as.numeric(difftime(dat$end_dt, dat$start_dt, units = "hours")) # 3. 添加指定ID列 dat$ID <- c(101, 101) # 整理为目标显示格式(将日期时间转为字符型) dat$start <- format(dat$start_dt, "%Y-%m-%d %H:%M") dat$end <- format(dat$end_dt, "%Y-%m-%d %H:%M") # 保留所需列 dat <- dat[, c("ID", "start", "end", "diff")] print(dat)
分步说明
1. 日期时间格式转换
- 使用
lubridate包的mdy_hm()函数可直接识别带AM/PM的字符串,自动转换为标准POSIXct日期时间类型(天然是24小时制)。 - 若不想用第三方包,可使用基础R的
strptime():
其中dat$start_dt <- strptime(dat$start, "%Y-%m-%d %I:%M%p") dat$end_dt <- strptime(dat$end, "%Y-%m-%d %I:%M%p")%I代表12小时制小时数,%p匹配AM/PM标识。
2. 时间差计算
- 用
difftime()计算两个日期时间的差值,指定units = "hours"后转为数值型,得到精确小时数:- 第一行实际差值:2022-01-10 21:35到2022-01-11 07:00,结果为9.4167小时(约9小时25分钟)
- 第二行实际差值:2022-01-10 22:35到2022-01-11 08:00,结果为9.4167小时(约9小时25分钟)
- 若需要整数小时,可使用
round()或floor()处理:# 四舍五入到整数 dat$diff <- round(dat$diff) # 向下取整 dat$diff <- floor(dat$diff)
3. 添加ID列
直接给数据框新增列并赋值即可:
dat$ID <- c(101, 101)
最终输出示例
ID start end diff 1 101 2022-01-10 21:35 2022-01-11 07:00 9.416667 2 101 2022-01-10 22:35 2022-01-11 08:00 9.416667
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

