我正在寻找一种在day and month
日期表示中放弃(如果存在)0的方法。另外,我有角色的格式......
以下是我想要的可重现的例子:
df <-
data.frame(
exemple = c(
"01/12/2017",
"01-02-2017",
"2017/02/12",
"2017/02/01",
"2017/02/01 10:01:05",
"2017/02/01 02:01:05"
),
format = c(
"%d/%m/%Y" ,
"%d-%m-%Y" ,
"%Y/%d/%m" ,
"%Y/%d/%m" ,
"%Y/%d/%m %H:%m:%s" ,
"%Y/%d/%m %H:%m:%s"
),
result = c(
"1/12/2017",
"1-2-2017" ,
"2017/2/12" ,
"2017/2/1" ,
"2017/2/1 10:01:05" ,
"2017/2/1 02:01:05"
)
)
哪个给:
exemple format result
1 01/12/2017 %d/%m/%Y 1/12/2017
2 01-02-2017 %d-%m-%Y 1-2-2017
3 2017/02/12 %Y/%d/%m 2017/2/12
4 2017/02/01 %Y/%d/%m 2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05
它包含以下列:
正如您所看到的,每个日期都有不同的格式,因此我希望以最通用的方式来完成它。 最通用的,我的意思是它应该适用于任何类型的分隔符,以及任何日期格式
请注意,我注意到变量的内容与格式化输出混淆:我想改变它自己的角色。
感谢。
答案 0 :(得分:1)
这是实现目标的一种方式:
df$myresult = gsub("(?<=^|(?![:])[[:punct:]])0", "", df$exemple, perl = TRUE)
<强>结果:强>
> df
exemple format result myresult
1 01/12/2017 %d/%m/%Y 1/12/2017 1/12/2017
2 01-02-2017 %d-%m-%Y 1-2-2017 1-2-2017
3 2017/02/12 %Y/%d/%m 2017/2/12 2017/2/12
4 2017/02/01 %Y/%d/%m 2017/2/1 2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05 2017/2/1 02:01:05
注意:强>
这个正则表达式看起来有点奇怪,因为我在一个积极的外观背后放置了一个负面的前瞻。 (?![:])[[:punct:]]
匹配所有标点符号,但 :
除外。因此,整个正则表达式匹配所有0,它们来自标点符号:
之后,或者位于字符串的开头。
答案 1 :(得分:0)
这将通过查找包含四位数年份的字符串来标识日期,然后使用gsub
删除任何前面没有其他数字的零。所以它应该留下数年,时间和非领先的零点。函数中的x
是第一个参数(即日期)的捕获组。
如果您将:
作为日期分隔符,或:
以外的其他内容(例如-
)作为时间分隔符,这甚至应该有效,但如果您有两位数的年份。
library(gsubfn)
df$result <- gsubfn("([^\\s]*\\d{4}[^\\s]*)",
~gsub("(^|[^0-9]+)0(\\d+)", "\\1\\2", x),
as.character(df$exemple))
df
exemple format result
1 01/12/2017 %d/%m/%Y 1/12/2017
2 01-02-2017 %d-%m-%Y 1-2-2017
3 2017/02/12 %Y/%d/%m 2017/2/12
4 2017/02/01 %Y/%d/%m 2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05