【问题标题】:ISO 8601 extended duration format PnYnMnDTnHnMnS in RR 中的 ISO 8601 扩展持续时间格式 PnYnMnDTnHnMnS
【发布时间】:2017-12-08 17:01:55
【问题描述】:

有什么方法可以解析ISO 8601 duration 例如“P3Y6M4DT12H30M5S”并返回如下内容: "3年6个月4天12:30:05"

我对@9​​87654322@ 的持续时间或parsedate 包没有运气。

【问题讨论】:

    标签: r datetime duration lubridate


    【解决方案1】:

    我也不知道有任何此类包(可能存在)来解决,但您可以使用正则表达式以您的方式解析它,因为该模式将被修复(“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"
    

    【讨论】:

    • 使用这种模式,单个数字可以有一个前导零,例如05 而不是 5,“12:30:05”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2014-08-16
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多