【发布时间】:2017-12-08 17:01:55
【问题描述】:
有什么方法可以解析ISO 8601 duration 例如“P3Y6M4DT12H30M5S”并返回如下内容: "3年6个月4天12:30:05"
我对@987654322@ 的持续时间或parsedate 包没有运气。
【问题讨论】:
标签: r datetime duration lubridate
有什么方法可以解析ISO 8601 duration 例如“P3Y6M4DT12H30M5S”并返回如下内容: "3年6个月4天12:30:05"
我对@987654322@ 的持续时间或parsedate 包没有运气。
【问题讨论】:
标签: r datetime duration lubridate
我也不知道有任何此类包(可能存在)来解决,但您可以使用正则表达式以您的方式解析它,因为该模式将被修复(“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"
【讨论】: