You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:58:20