将日期格式化为R格式,不带前导零

z9gpfhce  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(141)

是否有一种方法可以在日期对象上使用format函数,特别是POSIXltPOSIXctDate类的对象,格式为%Y, %m, %d,以便从这3个字段中的每一个字段中去掉前导零?
例如,我希望format(as.Date("1998-09-02"), "%Y, %m, %d")返回1998, 9, 2,而不是1998, 09, 02

cx6n0qe3

cx6n0qe31#

只需删除末尾的前导零:

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

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

pb3skfrl

pb3skfrl2#

您可以通过简单地更改strftime字符串来实现这一点,但这取决于您的平台(Unix或Windows)。
Unix
在要删除前导零的每个术语前插入减号(-):

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

Windows

在每个所需术语前插入磅号(#):

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

ycl3bljg3#

通过使用{lubridate} packageyear()month()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 package(v2.0.0)于2021年4月19日创建
2023年3月2日编辑:
在{tidyverse} 2.0.0之后,{lubridate}是在连接{tidyverse}之后连接的,因此现在不需要连接{lubridate}:

library(tidyverse)
dt <- "1998-09-02"
str_glue("{year(dt)}, {month(dt)}, {day(dt)}")
#> 1998, 9, 2

创建于2023年3月2日,使用reprex v2.0.2
如果使用{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 package(v2.0.0)于2021年4月19日创建

sqxo8psd

sqxo8psd4#

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

gsub("(\\D)0", "\\1", format(as.Date("1998-09-02"), "%Y, %m, %d"))

相关问题