29

有没有办法format在日期对象上使用该函数,特别是 class POSIXltPOSIXct或的对象Date,其格式%Y, %m, %d可以从这三个字段中的每个字段中去除前导零?

例如,我想format(as.Date("1998-09-02"), "%Y, %m, %d")返回1998, 9, 2而不是1998, 09, 02

4

4 回答 4

17

只需删除最后的前导零:

gsub(" 0", " ", format(as.Date("1998-09-02"), "%Y, %m, %d"))
## [1] "1998, 9, 2"

使用%e获取前导空格而不是前导零。

于 2014-08-19T15:25:05.657 回答
13

您可以通过对strftime格式字符串进行简单更改来做到这一点。但是,这取决于您的平台(Unix 或 Windows)。

Unix

-在您要删除前导零的每个术语之前插入一个减号 ( ):

format(as.Date("2020-06-02"), "%Y, %-m, %-d")
[1] "2020, 6, 2"

视窗

#在每个所需术语之前插入一个井号 ( ):

format(as.Date("2020-06-02"), "%Y, %#m, %#d")
[1] "2020, 6, 2"
于 2020-06-02T19:28:28.700 回答
10

我通过使用year(),month(){lubridate} 包day()的功能发现了一种解决方法。在 的帮助下,很容易做到以下几点:glue::glue()

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
library(glue)
dt <- "1998-09-02"
glue("{year(dt)}, {month(dt)}, {day(dt)}")
#> 1998, 9, 2

reprex 包于 2021-04-19 创建 (v2.0.0 )

如果使用 {tidyverse}(@banbh 建议),则str_glue()可以使用:

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
dt <- "1998-09-02"
str_glue("{year(dt)}, {month(dt)}, {day(dt)}")
#> 1998, 9, 2

reprex 包于 2021-04-19 创建 (v2.0.0 )

于 2018-06-18T03:41:14.253 回答
1

使用 gsub 的更通用的解决方案,从 %m 或 %d 生成的日期或月份数字中删除前导零。这将删除前面没有数字的任何零:

gsub("(\\D)0", "\\1", format(as.Date("1998-09-02"), "%Y, %m, %d"))
于 2020-09-09T21:47:02.847 回答