R 中的 ISO 8601 扩展持续时间格式 PnYnMnDTnHnMnS

ISO 8601 extended duration format PnYnMnDTnHnMnS in R

有什么方法可以解析 ISO 8601 duration 例如"P3Y6M4DT12H30M5S" 和 return 类似于: “3 年 6 个月 4 天,12:30:05”

我没有运气 lubridate's durations or parsedate 包裹。

我也不知道有任何这样的包(可能存在)可以解决,但您可以使用正则表达式以您的方式解析它,因为模式将被修复("PnYnMnDTnHnMnS"),根据维基百科:

gsub("P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S", "\1 Years, \2
Months, \3 Days, \4:\5:\6", "P3Y6M4DT12H30M5S")

输出:

[1] "3 Years, 6 Months, 4 Days, 12:30:5"

编辑:

如果您只对秒的填充零感兴趣,我在向量中添加了两个元素,一个是单位秒数,另一个是两位数秒(假设秒数不会超过 60 ) 来验证正则表达式:

    vect <- c("P3Y6M4DT12H30M5S", "P3Y6M4DT12H30M15S")
    ifelse(grepl(".*M(\d)S", vect), gsub("P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d)S", "\1 Years, \2 Months, \3 Days, \4:\5:0\6", vect), gsub("P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S", "\1 Years, \2 Months, \3 Days, \4:\5:\6", vect))

输出:

[1] "3 Years, 6 Months, 4 Days, 12:30:05"  
[2] "3 Years, 6 Months, 4 Days, 12:30:15"

如果您有兴趣填充单个数字的每个元素:

topad <- gsub("P(\d+)Y(\d+)M(\d+)DT(\d+)H(\d+)M(\d+)S", "\1-\2-\3-\4-\5-\6", vect)
library(stringr)
splitvect <- strsplit(topad,split="-")
unlist(lapply(splitvect, function(x)paste0(str_pad(x, 2, "0", side="left"), c("Years, ", "Months, ", "Days, ", ":", ":", ""), collapse= "")))

输出:

[1] "03Years, 06Months, 04Days, 12:30:05"
[2] "03Years, 06Months, 04Days, 12:30:15"