如何将lubridate::duration输出的时长转换为ISO8601标准时长格式
解决方案
情况1:持有lubridate的duration原生对象
直接用lubridate内置的format_ISO8601()函数即可完成转换,示例代码:
library(lubridate) # 生成duration对象 dur <- duration("PT1H3M") # 转换为ISO8601格式 format_ISO8601(dur) # 输出结果: "PT1H3M"
情况2:仅持有lubridate打印输出的字符串
如果你的输入只有类似"3780s (~1.05 hours)"的打印字符串,先提取字符串中的秒数,转换为duration对象后再格式化即可,可参考下面的自定义函数:
dur_str_to_iso8601 <- function(dur_print_str) { library(lubridate) # 提取字符串开头的秒数数值 second_val <- as.numeric(gsub("^([0-9]+)s.*$", "\\1", dur_print_str)) # 转换为duration后格式化为ISO8601 return(format_ISO8601(duration(second_val, unit = "seconds"))) } # 测试调用 dur_str_to_iso8601("3780s (~1.05 hours)") # 输出结果: "PT1H3M"
ISO 8601时长格式规则说明
- 所有时长标识以大写字母
P开头,代表「周期」- 日期维度的单位紧跟在
P之后,可用单位包括Y(年)、M(月)、W(周)、D(日)- 时间维度的内容前需要加大写字母
T分隔,可用单位包括H(时)、M(分)、S(秒)- 仅包含时间维度的时长不会出现日期单位,示例
PT1H3M对应1小时3分钟
内容的提问来源于stack exchange,提问作者karuno
相关产品推荐
相关产品推荐

