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

如何利用二进制变量为时间字段添加AM/PM标识以正确计算时间差

给时间列添加AM/PM标识并计算正确时间差

情况1:原时间列为字符串格式(如"11H 30M 0S")

直接通过字符串拼接添加AM/PM标识,再转换为R可识别的时间对象:

library(tidyverse)
library(lubridate)

# 假设你的数据框名为df
df <- df %>%
  mutate(
    # 处理var1:转换格式并添加AM/PM,再转为时间对象
    var1_time = case_when(
      var1a == 2 ~ str_c(str_replace(var1, "(\\d+)H (\\d+)M (\\d+)S", "\\1:\\2:\\3"), " AM"),
      var1a == 1 ~ str_c(str_replace(var1, "(\\d+)H (\\d+)M (\\d+)S", "\\1:\\2:\\3"), " PM")
    ) %>% parse_time(format = "%H:%M:%S %p"),
    # 同理处理var2
    var2_time = case_when(
      var2a == 2 ~ str_c(str_replace(var2, "(\\d+)H (\\d+)M (\\d+)S", "\\1:\\2:\\3"), " AM"),
      var2a == 1 ~ str_c(str_replace(var2, "(\\d+)H (\\d+)M (\\d+)S", "\\1:\\2:\\3"), " PM")
    ) %>% parse_time(format = "%H:%M:%S %p"),
    # 计算时间差(可指定units为"hours"/"minutes"/"seconds")
    total_duration = difftime(var2_time, var1_time, units = "hours")
  )

代码说明:

  • str_replace 通过正则表达式把"XH YM ZS"格式替换为"X:Y:Z"的标准时分秒格式;
  • case_when 根据var1a/var2a的值拼接AM/PM后缀;
  • parse_time 将带AM/PM的字符串转换为hms类型的时间对象,自动处理12AM/PM的24小时制转换;
  • difftime 基于转换后的时间对象计算差值,结果可准确区分上午/下午时间。

情况2:原时间列为hms/POSIXct时间类型

如果var1/var2已经是R可识别的时间对象,可直接提取时分秒并调整为24小时制:

library(tidyverse)
library(lubridate)

df <- df %>%
  mutate(
    # 处理var1:转换为24小时制时间
    var1_time = case_when(
      # 12AM转为00:00
      var1a == 2 & hour(var1) == 12 ~ hms(hour = 0, minute = minute(var1), second = second(var1)),
      # 其他AM时间保持原小时
      var1a == 2 ~ hms(hour = hour(var1), minute = minute(var1), second = second(var1)),
      # 12PM保持12:00
      var1a == 1 & hour(var1) == 12 ~ hms(hour = 12, minute = minute(var1), second = second(var1)),
      # 其他PM时间小时加12
      var1a == 1 ~ hms(hour = hour(var1) + 12, minute = minute(var1), second = second(var1))
    ),
    # 同理处理var2
    var2_time = case_when(
      var2a == 2 & hour(var2) == 12 ~ hms(hour = 0, minute = minute(var2), second = second(var2)),
      var2a == 2 ~ hms(hour = hour(var2), minute = minute(var2), second = second(var2)),
      var2a == 1 & hour(var2) == 12 ~ hms(hour = 12, minute = minute(var2), second = second(var2)),
      var2a == 1 ~ hms(hour = hour(var2) + 12, minute = minute(var2), second = second(var2))
    ),
    # 计算时间差
    total_duration = difftime(var2_time, var1_time, units = "hours")
  )

代码说明:

  • 针对12点的特殊情况单独处理(12AM转为0点,12PM保持12点);
  • 非12点的PM时间直接将小时数加12,转为24小时制;
  • 最终生成的var1_time/var2_time为标准24小时制时间对象,确保difftime计算结果准确。

内容的提问来源于stack exchange,提问作者Addy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17