如何利用二进制变量为时间字段添加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
相关产品推荐
相关产品推荐

