Как преобразовать десятичный формат даты (например, 2011.580) в обычный формат даты?
Я пытаюсь перейти от десятичного формата даты (тип возврата cpts.ts() из пакета точек изменения) к обычному формату даты%Y-%m-%d. Пример:
cpts.ts(myTimeSeries.BinSeg)
[1] 2001.667 2004.083 2008.750 2011.583 2011.917
Фактические даты - где-то в августе 2001 года, январе 2004 года, сентябре 2008 года, июне / июле 2011 года и декабре 2011 года (я их точно не знаю, я читаю их с графика).
Я не могу найти стандартный метод преобразования этого формата обратно в обычный формат даты.
Кто-нибудь может мне помочь?
Спасибо
3 ответа
Немного разные результаты с lubridate
:
library(lubridate)
decimals <- c(2001.667, 2004.083, 2008.750, 2011.583, 2011.917)
format(date_decimal(decimals), "%Y-%m-%d")
# [1] "2001-09-01" "2004-01-31" "2008-10-01" "2011-08-01" "2011-12-01"
> foo <- c(2001.667,2004.083,2008.750,2011.583,2011.917)
> as.Date(paste(trunc(foo),round((foo-trunc(foo))*365,0)),"%Y %j")
[1] "2001-08-31" "2004-01-30" "2008-09-30" "2011-08-01" "2011-12-01"
смотреть на ?as.Date
И его format
параметр, который направит вас к ?strptime
из которого я взял %j
спецификация формата.
Возможно, вам придется адаптироваться к некоторым угловым случаям, таким как 1 января.
Для тех, кто рассматривает решение этой проблемы с помощью базового R, ядро lubridate date_decimal
по существу:
start <- as.POSIXct(paste0(trunc(foo), "/01/01"), tz="UTC")
end <- as.POSIXct(paste0(trunc(foo)+1,"/01/01"), tz="UTC")
start + (difftime(end, start, units="secs") * (foo - trunc(foo)))
Т.е. - установить start
дата в начале года, в котором происходит дата, установите end
дата в начале следующего года, умножьте разницу между началом и концом на долю прошедшего года, добавьте эту разницу обратно к началу. Это учитывает високосные годы и будет работать соответствующим образом на 1 января.