在R语言中拆分含H、M、S的时间字符串为时分秒列
嘿,处理这种ISO 8601风格的持续时间拆分,R里有几种很实用的方案,我给你详细说说:
方法1:用lubridate包(推荐,健壮性强)
lubridate是R里专门处理时间数据的工具包,对ISO持续时间格式有原生支持,能自动处理缺失的时间部分,非常省心。
# 先安装并加载包(如果没装过的话) install.packages("lubridate") library(lubridate) # 构造你的示例数据框 df <- data.frame( duration = c("PT1H57M3S", "PT1H3M46S","PT1H33S","PT1H2M", "PT18S","PT18M9S", "PT1H39M22S") ) # 解析为持续时间对象,提取小时、分钟、秒 df$H <- hour(duration(df$duration)) df$M <- minute(duration(df$duration)) df$S <- second(duration(df$duration)) # 查看结果 print(df)
运行后会自动给缺失的时间部分补0,比如PT18S对应的H列是0、M列是0,完全不用手动处理异常情况。
方法2:用正则表达式(无需额外包,适合固定格式场景)
如果你不想加载额外包,用字符串正则匹配也能实现,这里用stringr包简化操作(base R也能写,但代码会繁琐一些):
install.packages("stringr") library(stringr) df <- data.frame( duration = c("PT1H57M3S", "PT1H3M46S","PT1H33S","PT1H2M", "PT18S","PT18M9S", "PT1H39M22S") ) # 提取各时间部分,无匹配则补0 df$H <- as.integer(str_replace_na(str_extract(df$duration, "\\d+(?=H)"), "0")) df$M <- as.integer(str_replace_na(str_extract(df$duration, "\\d+(?=M)"), "0")) df$S <- as.integer(str_replace_na(str_extract(df$duration, "\\d+(?=S)"), "0")) print(df)
这里用\\d+(?=H)这种正向预查正则,匹配'H'前面的数字;str_replace_na把没匹配到的结果换成0,最后转成整数类型。
两种方法都能得到你想要的拆分结果,个人更推荐lubridate方案,它能兼容更多复杂的持续时间格式(比如带天数的P2DT3H),扩展性更强。
内容的提问来源于stack exchange,提问作者Dhiraj Upadhyaya
相关产品推荐
相关产品推荐

