2009-12-01 13 views
5

estoy obteniendo un resultado que no entiendo en R.¿Por qué se analiza sintácticamente "% Y-% m" usando strptime en R dando un resultado NA, pero funciona "% Y-% m-% d"?

Si uso strptime con un año y un día formateado% Y-% m (como "2009-12"), me sale un resultado NA. Pero si agrego un día, como "2009-12-01", y cambio la cadena de formato en consecuencia, obtengo un resultado. Ejemplo:

> strptime("2009-12",format="%Y-%m") 
[1] NA 
> strptime("2009-12-03",format="%Y-%m-%d") 
[1] "2009-12-03" 

¿Por qué es eso?

Actualización: Lo siento curiosidad por qué es strptime no analiza un año y un mes, y la razón parece raro que no lo haría porque es hace analizar un año solamente, o un año y un día:

> strptime("2009",format="%Y") # year only. Works. Uses current month and day as defaults. 
[1] "2009-12-02" 
> strptime("2009-03",format="%Y-%d") # year and day. Works. Uses current month as default. 
[1] "2009-12-03" 
> strptime("2009-03",format="%Y-%m") # year and month. Doesn't work. ? 
[1] NA 

Update para explicar por qué esto no es un duplicado La posible duplicado se le pidió un par de años después de esta pregunta y que tiene que ver con una API independiente en R: la función asDate. Esta pregunta se trata de una peculiaridad de la función strptime que a partir de R 3.1.3 todavía se aplica.

+2

Dado que las fechas tienen días? ¿Qué esperas que produzca? – hadley

+0

¿Querías que fuera el día del año? Si es así, prueba con "% j". –

+1

Esperaba que utilizara el día actual como predeterminado, de la misma forma que lo haría si hiciera strptime ("2009", formato = "% Y"). Esto da como resultado "2009-12-01". – bantic

Respuesta

1

Eso me parece un comportamiento sensato. Según lo veo, una mejor pregunta sería "¿por qué te permite hacer esto: strptime("2009-03",format="%Y-%d")?"

Aquí hay una solución para conseguir lo que creo que está tratando de lograr (es decir, un objeto POSIXlt con un mes y año especificado, pero día de hoy):

as.POSIXlt(paste("2009-12", days(Sys.Date()), sep="-")) 
+0

¿Entonces es solo una extraña idiosincrasia del lenguaje? – bantic

+1

No, es un requisito ya que una 'fecha' designa un día en un mes en un año, y solo dar un mes y un año no es equivalente. –

+1

Pero entonces, ¿por qué funciona si le das solo un año, o solo un año y un día? – bantic

1

sólo estoy adivinando. Pero si toma un año y un día, probablemente tome un año y un día en el rango de 1-365 (o 366 para años bisiestos). Lo que podría hacer es usar paste() y agregar -01 al final para obtener el formato estándar YYYY-MM-DD.

Aquí está la prueba que ejecuté.

strptime("2009-123",format="%Y-%d") 

vuelve "2009-05-12"

Cuestiones relacionadas