在R语言中计算两个日期之间的时长
解决lubridate处理非标准日期格式的问题
你遇到的核心问题是原始日期数据是未解析的字符串格式,lubridate没法直接识别这种带AM/PM的美式日期格式,所以得先把它们转换成标准的datetime对象,再进行时长计算。下面是完整的解决步骤:
步骤1:加载lubridate包并构造示例数据
先把你的日期数据放进数据框,方便后续操作:
library(lubridate) # 构造示例数据 df <- data.frame( Begin = c("1/12/2011 6:00 AM", "1/26/2011 5:00 PM"), End = c("1/12/2011 2:00 PM", "1/31/2011 8:00 AM"), stringsAsFactors = FALSE )
步骤2:解析非标准日期格式
你的日期是月/日/年 小时:分钟 AM/PM的格式,lubridate的mdy_hm()函数刚好能识别这种12小时制的美式日期:
# 将字符串日期解析为datetime对象 df$Begin_dt <- mdy_hm(df$Begin) df$End_dt <- mdy_hm(df$End)
这里mdy_hm的含义是:month-day-year + hour-minute,它会自动处理AM/PM对应的12小时制到24小时制的转换。
步骤3:计算时间间隔的小时数
现在有了标准的datetime对象,就可以用你原本的思路计算时长,最后转成小时数更直观:
# 创建时间间隔 df$time_interval <- df$Begin_dt %--% df$End_dt # 转换为时长并提取小时数 df$hour_duration <- as.duration(df$time_interval) / dhours(1)
最终结果
运行完代码后,你会得到包含小时时长的数据框:
print(df) # Begin End Begin_dt End_dt time_interval hour_duration # 1 1/12/2011 6:00 AM 1/12/2011 2:00 PM 2011-01-12 06:00:00 2011-01-12 14:00:00 8H 0M 0S 8 # 2 1/26/2011 5:00 PM 1/31/2011 8:00 AM 2011-01-26 17:00:00 2011-01-31 08:00:00 111H 0M 0S 111
简单总结:lubridate的时间间隔/时长功能必须基于标准datetime对象工作,所以第一步的日期解析是关键,完成解析后后续计算就和你原本的思路完全一致了。
内容的提问来源于stack exchange,提问作者steppermotor
相关产品推荐
相关产品推荐

