2013-05-16 2 views
2

У меня есть переменная POSIXct со значением «2012-04-15 16:49:36 CEST». Функция возвращает формат год, неделю года и день недели в десятичных числах, для этого примера 2012 15 0. описания формата для тех, кто менее знакомы с ним:format.POSIXct to as.POSIXct проблема преобразования

  • % Y: Год с веком.
  • % W: Неделя года в виде десятичного числа (00-53) с понедельника в качестве первого дня недели (и обычно с в первый понедельник года как день 1 недели 1). Британская конвенция.
  • % w: День недели как десятичное число (0-6, воскресенье 0).

Затем я пытаюсь преобразовать значения обратно в переменную POSIXct и произойдет что-то неожиданное. Когда я читаю значения, функции, похоже, интерпретируют неверную дату (2012-04-08). Однако неожиданность возникает, когда я делаю ту же процедуру со вторым примером, использующим Sys.time(), и работает, как и ожидалось. Может кто-нибудь объяснить мне, почему это не работает в первом примере?

(TS <- structure(1334501376, class = c("POSIXct", "POSIXt"))) 
(TS_YWw <- format(TS,format="%Y %W %w")) 
as.POSIXct(TS_YWw,format="%Y %W %w") 

(TS <- Sys.time()) 
(TS_YWw <- format(TS,format="%Y %W %w")) 
as.POSIXct(TS_YWw,format="%Y %W %w") 

Выход

> (TS <- structure(1334501376, class = c("POSIXct", "POSIXt"))) 
[1] "2012-04-15 16:49:36 CEST" 
> (TS_YWw <- format(TS,format="%Y %W %w")) 
[1] "2012 15 0" 
> as.POSIXct(TS_YWw,format="%Y %W %w") 
[1] "2012-04-08 CEST" 
> 
> (TS <- Sys.time()) 
[1] "2013-05-16 15:27:44 CEST" 
> (TS_YWw <- format(TS,format="%Y %W %w")) 
[1] "2013 19 4" 
> as.POSIXct(TS_YWw,format="%Y %W %w") 
[1] "2013-05-16 CEST" 

Кстати, я побежал код на 32-битной машине Windows XP с R 2.15.3. Спасибо вам всем!

+0

Это иллюстрирует проблему лучше: 'format (as.POSIXct (" 2012-01-01 CEST "), format ="% Y% W% w "); as.POSIXct ("2012 1 0", format = "% Y% W% w") '. 2012-01-01 было воскресенье. Та же проблема существует и с 2006 годом, которая также началась в воскресенье. – Roland

+2

Эта ошибка известна: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15195 – Roland

+0

Эта ошибка исправлена ​​недавно: http://sourceware.org/bugzilla/show_bug.cgi?id = 15100 – Emer

ответ

1

Кажется, что ошибка. Ниже я создаю последовательность дней в 2012 году (dtimes) и конвертирую в строки и обратно, используя формат «% Y% W% w». Сравнение двух серий и выход head показывают, какие даты не были сохранены при преобразовании. Существует явный недельный образец. Обратите также внимание, что as.POSIXct('2012 0 0', '%Y %W %w') возвращает NA.

dtimes <- seq(as.POSIXct('2012-1-1'), as.POSIXct('2013-1-1'), by=as.difftime(1, units='days')) 

convert.YWw <- function(dtime) { 
    fmt <- "%Y %W %w" 
    string <- format(dtime, format=fmt) 
    as.POSIXct(string, format=fmt) 
} 
converted <- lapply(dtimes, convert.YWw) 
preserved <- dtimes == converted 
dtimes.and.converted <- mapply(function(d, c) c(dtime=d, convert=c), dtimes, converted, SIMPLIFY=FALSE) 
head(dtimes.and.converted[! preserved]) 

# [[1]] 
# NULL 
# 
# [[2]] 
#   dtime   convert 
# "2012-01-08 EST" "2012-01-01 EST" 
# 
# [[3]] 
#   dtime   convert 
# "2012-01-15 EST" "2012-01-08 EST" 
# 
# [[4]] 
#   dtime   convert 
# "2012-01-22 EST" "2012-01-15 EST" 
# 
# [[5]] 
#   dtime   convert 
# "2012-01-29 EST" "2012-01-22 EST" 
# 
# [[6]] 
#   dtime   convert 
# "2012-02-05 EST" "2012-01-29 EST" 
Смежные вопросы