从时间戳 %j%Y %H:%M 中删除前导零

7

我的时间戳以以下形式表示

0992006 09:00

我需要移除前导零以得到以下形式:
992006 9:00

这是我现在正在使用的代码,它不会删除前导零:
prediction$TIMESTAMP <- as.character(format(prediction$TIMESTAMP, '%j%Y %H:%M'))

2
你可能应该去掉 as.character()。我熟悉的所有格式化函数都返回 'character' 类型的向量。 - IRTFM
6个回答

8

最简单的方法是创建自己的定界符,该定界符断言字符串的开头或空格之前存在。

gsub('(^| )0+', '\\1', '0992006 09:00')
# [1] "992006 9:00"

您可以使用一个技巧来使替换免除某些部分。 \K 重置报告匹配的起始点,之前已经匹配的字符将不再包括在内。

gsub('(^| )\\K0+', '', '0992006 09:00', perl=T)
# [1] "992006 9:00"

或者您可以使用sub并匹配到第二组前导零。

sub('^0+([0-9]+ )0+', '\\1', '0992006 09:00')
# [1] "992006 9:00"

为了覆盖所有可能性,如果您知道您将来会有像0992006 00:00这样的格式,只需从正则表达式中删除+量词,使其仅删除第一个前导零。

你的第一个例子让我感到惊讶(至今仍然如此)。我不确定 "\\1" 是如何定义的。我习惯于它由第一对括号中的内容来定义,但在这里似乎不适用。 - IRTFM
@BondedDust 假设你有一个捕获组,像这样 (foo|bar),它将捕获 foo 或 bar,\\1 返回替换中所捕获的结果。那么这里的工作方式有点类似,(^| ) 基本上捕获字符串开头的零宽度空格 ^ 或者前导零之前的空格字符,因此在替换中,\\1 将仅返回空格字符到其原始位置,因为 ^ 锚定了字符串的开头,实际上没有匹配。您可以在此处查看零宽度位置,http://regex101.com/r/aO6uJ0/1 - hwnd

7
这里有另一种选项,使用回顾后发表。
gsub("(^0)|(?<=\\s)0", "", "0992006 09:00", perl = TRUE)
## [1] "992006 9:00"

7
str1 <- "0992006 09:00"
gsub("(?<=^| )0+", "", str1, perl=TRUE)
#[1] "992006 9:00"

对于以下类似情况,可以采取以下方法:

str2 <- "0992006 00:00"
 gsub("(?<=^| )0", "", str2, perl=TRUE)
 #[1] "992006 0:00"

解释

这里的想法是使用 look behind (?<=^| )0+ 来匹配字符串中的 0s。

如果它出现在字符串的开头 (?<=^

或者 |

如果它在一个空格后面 )0+

并且在 gsub 的第二部分参数中将那些匹配的 0s 替换为 ""

在第二个字符串中,hourminutes 都是 0's。因此,使用第一个 code 将会得到:

 gsub("(?<=^| )0+", "", str2, perl=TRUE)
 #[1] "992006 :00"

这里并不清楚OP希望得到什么结果。所以,我认为,与其在:前移除所有的0,不如只保留一个0更好。因此,我将多个0+的代码替换为一个0,然后用""进行替换。


解释一下“向后查找”的正则表达式形式可能会有所帮助。(我有时也会犯只回答代码的正则表达式的错误,但我认为添加条件起始点值得一些解释。) - IRTFM

2

使用 sub 标签:

  sub("^[0]+", "", prediction$TIMESTAMP) 
[1] "992006 09:00"

我需要删除时间中的前导零。您能向我展示如何使用sub来实现吗? - kilojoules

1

您也可以使用 stringr,而无需使用正则表达式,只需使用子字符串。

> library(stringr)
> str_c(str_sub(word(x, 1:2), 2), collapse = " ")
# [1] "992006 9:00"

1
一些更多的 Perl 正则表达式,
> gsub("(?<!:)\\b0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"
> gsub("(?<![\\d:])0+", "", "0992006 09:00", perl=T)
[1] "992006 9:00"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接