Преобразование chr "00: 00: 00" в date-time " 00: 00: 00"


Мой вопрос исходит из этого вопроса. Вопрос имел следующую символьную строку.

x <- "2007-02-01 00:00:00"
y <- "02/01/2007 00:06:10"

Если вы попытаетесь преобразовать эту строку в объект класса date, произойдет нечто забавное.

Это пример из ответа @nrusell.

as.POSIXct(x,tz=Sys.timezone())
[1] "2007-02-01 EST"

as.POSIXct(y,format="%m/%d/%Y %H:%M:%S",tz=Sys.timezone())
[1] "2007-02-01 00:06:10 EST" 

Как вы видите, 00:00:00 исчезает из первого примера. @Richard Scriven оставил следующий пример в нашем обсуждении, используя lubridate.

dt <- as.POSIXct("2007-02-01 00:00:00")
hour(dt) <- hour(dt)+1
dt
[1] "2007-02-01 01:00:00 EST"
hour(dt) <- hour(dt)-1
dt
[1] "2007-02-01 EST"

Снова исчезает 00:00:00. Почему R избегает держать 00:00:00 в объект класса даты после преобразования? Как мы можем сохранить 00:00:00?

1 5

1 ответ:

Это просто print, которые удаляют точность, если временная часть даты-полночь. Это literlay объясняется в справке ??strftime, особенно параметр format:

Символьная строка. По умолчанию используется "%Y - %m - %d %H:%M:%S", Если есть компонент имеет компонент времени, который не является полуночью, и "%Y - %m - %d" в противном случае

Одна из идей состоит в том, чтобы переопределить метод S3 print для объекта POSIXct:
print.POSIXct <- function(x,...)print(format(x,"%Y-%m-%d %H:%M:%S"))

Теперь для вашего примера, если вы печатаете свою дату x(с полуночью часть) вы получаете:

x <- "2007-02-01 00:00:00"
x <- as.POSIXct(x,tz=Sys.timezone())
x
[1] "2007-02-01 00:00:00"