当前位置: 首页 > 知识库问答 >
问题:

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

夏侯浩气
2023-03-14

是否有任何方法可以解析ISO 8601持续时间,例如“P3Y6M4DT12H30M5S”,并返回类似“3年、6个月、4天、12:30:05”的内容

我对润滑剂的持续时间或解析包没有运气。

共有1个答案

燕富
2023-03-14

我也不知道有任何这样的包(可能存在)需要解决,但根据维基百科的说法,您可以使用正则表达式以自己的方式对其进行解析,因为模式是固定的(“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"
 类似资料:
  • 我有ISO8601格式的持续时间值,我将其转换为时间值为整数秒,如下所示: ISO8601格式的持续时间值=“P1Y”。 我将该值存储在“时间-单位-秒”中。因此,当我检索的值将是在int,我想转换回ISO8601持续时间格式,所以我应该得到“P1Y”转换后回来。 有没有快速的方法可以做到这一点?或者我必须把时间的int值转换成float,然后通过某种方法把它转换成ISO8601持续时间。

  • 我正在寻找一种从“ISO 8601持续时间格式”(P0DT0H0M0S)转换为小时的便捷方法。 到目前为止,我想到了这个: 如您所见,我的方法是将数字拆分并乘以24、1、1/60、1/3600以得到小时。我可以减少代码量吗? 样本数据和所需结果 输入: 'P1DT2H3M44S' (1 天 2 小时 3 分 44 秒) 期望输出: 26.062222222222222 (这是小时)

  • 我正在将一个项目从Joda Time过渡到java8的本机时间库,我遇到了一个障碍。 我一直找不到持续时间的格式化程序。我想有一个自定义的字符串格式,例如HHH MM,其中75小时15分钟的持续时间将格式化为“75 15”。 通过转换为句点并使用句点Formatter,Joda-Time很容易做到这一点,但是我无法在Java8中找到这种类型的类。我错过了什么吗?

  • 我正在寻找javascript/jquery库,它可以为我提供UI和功能来选择ISO 8601格式的持续时间。 用户界面应包含多个级联选择框,用户可以选择月,小时,天,周...在ISO_8601中定义。 选择后,库应将其转换为标准ISO_8601持续时间格式的代码,反之亦然。 例如,“P3Y6M4DT12H30M5S”表示持续时间为“三年六个月四天十二小时三十分五秒”。

  • 问题内容: 我想使用H:MM:SS之类的格式以秒为单位格式化持续时间。Java中的当前实用程序旨在格式化时间而不是持续时间。 问题答案: 如果你使用的Java版本早于8 …,则可以使用Joda Time和PeriodFormatter。如果你确实有持续时间(例如,经过的时间量,没有参考日历系统),那么你可能应该大部分时间都在使用-然后可以致电(指定要反映25小时是否变为25小时) 1天1小时与否,

  • 我正试图使用时刻持续时间格式设置倒计时计时器的格式,但一旦时间达到60分钟以下,小时就会消失,例如60分钟显示为“01:00”,这是正确的59分钟显示为“59”,这是不正确的,它应该显示为“00:59” 其中3500000毫秒等于58分钟 我有以下代码: 显示结果:58,而不是00:58 我到底做错了什么? 我也尝试过这种变化,但没有任何效果