Форматирование даты в R без ведущих нулей

Есть ли способ использовать функцию format для объекта даты, в частности объекта класса POSIXlt, POSIXct или Date, с форматом %Y, %m, %d таким образом, чтобы начальные нули удалялись из каждого из этих 3 полей?

Например, я бы хотел, чтобы format(as.Date("1998-09-02"), "%Y, %m, %d") возвращало 1998, 9, 2, а не 1998, 09, 02.


person Jon Claus    schedule 19.08.2014    source источник


Ответы (4)


Просто удалите ведущие нули в конце:

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

Используйте %e, чтобы получить начальный пробел вместо начального нуля.

person G. Grothendieck    schedule 19.08.2014
comment
Мне странно, что нет такой опции, как %D или что-то еще, что удаляет ведущие нули. - person Tom; 21.05.2015
comment
может также сделать это fixed = TRUE - person MichaelChirico; 07.06.2017

Я нашел обходной путь, используя функции year(), month() и day() из пакета {lubridate}. С помощью 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

Создано 19 апреля 2021 г. в пакете reprex (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

Создано 19 апреля 2021 г. в пакете reprex (v2.0.0)

person Liang Zhang    schedule 18.06.2018
comment
Кроме того, если вы загрузили пакет tidyverse (или только stringr), вы можете использовать str_glue() вместо glue() и не загружать пакет glue. - person banbh; 25.09.2020

Вы можете сделать это, просто изменив строку формата strftime. Однако это зависит от вашей платформы (Unix или Windows).

Юникс

Вставьте знак минус (-) перед каждым термином, из которого вы хотите удалить ведущие нули:

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"
person RyanFrost    schedule 02.06.2020
comment
Мне нравится внешний вид этого решения, однако оно у меня не работает (в Windows):› format(as.Date(2020-06-02), %Y, %m, %d) [1] 2020, 06 , 02 › format(as.Date(2020-06-02), %Y, %#m, %#d) [1] 2020, #m, #d Интересно, почему... - person Luc; 19.08.2020
comment
Не работает на окнах - person Ljupcho Naumov; 19.04.2021

Более общее решение с использованием gsub для удаления начальных нулей из цифр дня или месяца, создаваемых %m или %d. Это удаляет любой ноль, которому не предшествует цифра:

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