2012-08-28 18 views
5

que tienen una cadena de caracteres de la fecha en formato Año semanas como tal:R - cadena de caracteres con una semana de Año: semana se pierde al convertir a formato Fecha

weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29", "2002-30", "2002-31") 

Sin embargo, la conversión de este personaje hasta la fecha resultados de la clase en una pérdida de la semana identificador:

> as.Date(weeks.strings, format="%Y-%U") 
[1] "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28" 
[6] "2002-08-28" 

Como puede observarse, el formato se convierte en año- concatena con la fecha de hoy, por lo que cualquier información sobre la semana original se ha perdido (ex - cuando se utiliza la función de formato o strptime para tratar de coaccionar de nuevo en el formato original.

Una solución que he encontrado en un grupo de ayuda es para especificar el día de la semana:

as.Date(weeks.strings, format="%Y-%u %U") 
[1] "2002-02-12" "2002-02-19" "2002-02-26" "2002-03-05" "2002-01-02" 
[6] "2002-01-09" 

Pero parece que esto resulta en la numeración de la semana incorrecto (no coincide con la cadena original).

Cualquier orientación sería apreciada.

+0

Las fechas no tienen un identificador de semana ... ¿puede agregar lo que esperaba que fuera la salida? –

+0

Joshua - Tengo un valor asociado con cada punto de datos semanal. Quiero poder trazar la semana versus el valor, por lo que conservar los datos como un objeto de fecha es importante para fines de trazado. El resultado esperado es el mismo que el de la cadena de caracteres original, pero de la clase Fecha. – zzk

Respuesta

9

Sólo tiene que añadir un día de la semana a su weeks.strings con el fin de hacer que las fechas no ambigua (adaptado de Jim Holtman's answer on R-help).

as.Date(paste(weeks.strings,1),"%Y-%U %u") 

Como se señaló en los comentarios, la clase Date no es apropiado si las fechas abarcan un horizonte de largo plazo, porque - en algún momento - el día de la semana elegido no existirá en la primera semana/última parte del año . En ese caso, podría usar un vector numérico donde la porción completa es el año y la porción decimal es la fracción de semanas/año. Por ejemplo:

wkstr <- sprintf("%d-%02d", rep(2000:2012,each=53), 0:52) 
yrwk <- lapply(strsplit(wkstr, "-"), as.numeric) 
yrwk <- sapply(yrwk, function(x) x[1]+x[2]/53) 
+0

+1 Muy inteligente. –

+0

Esto es más o menos lo que estaba buscando, ¡gracias! – zzk

+0

Lamentablemente encontré un error con este método. Una cadena con la semana 00 en ex - "2003-00" regresa como NA después de aplicar esta función. Aunque tal vez el error es tener la semana 0 en primer lugar? – zzk

4

Obviamente, no existe una solución única, ya que cada semana podría estar representada por cualquiera de hasta 7 fechas diferentes. Dicho esto, aquí está una idea:

weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29", 
        "2002-30", "2002-31") 

x <- as.Date("2002-1-1", format="%Y-%m-%d") + (0:52*7) 
x[match(weeks.strings, format(x, "%Y-%U"))] 
# [1] "2002-07-02" "2002-07-09" "2002-07-16" "2002-07-23" 
# [5] "2002-07-30" "2002-08-06" 
+0

No me importa qué día de la semana se especifique, siempre que sea consistente. Solo quiero trazar la frecuencia de los datos semanales. – zzk

Cuestiones relacionadas