Как преобразовать десятичный формат даты (например, 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 января.

Другие вопросы по тегам