2011-09-20 16 views
6

Me falta algo obvio con la sección "formato" de as.Date. Considere este ejemploNo se puede formatear meses con fecha.Fecha

d1 <- data.frame(d = c("1/Jan/1947", "1/Feb/1947", "1/Mar/1947"), d2 = c("Jan/1947", "Feb/1947", "Mar/1947"))

d1$date1 <- as.Date(x=d1$d, format="%d/%b/%Y") 
d1$date2 <- as.Date(x=d1$d2, format="%b/%Y") 

      d  d2  date1 date2 
1 1/Jan/1947 Jan/1947 1947-01-01 <NA> 
2 1/Feb/1947 Feb/1947 1947-02-01 <NA> 
3 1/Mar/1947 Mar/1947 1947-03-01 <NA> 

así que mi pregunta es muy simple - No entiendo por qué funciona, pero la fecha 2 FECHA1 no.

+3

Si en lugar de "por qué" le hubieran preguntado por el "cómo", entonces la respuesta habría sido"' require (zoológico); d1 $ fecha2 <- como. yearmon (d1 $ d2, format = "% b /% Y") ' –

+4

La clase' "yearmon" 'en el paquete del zoo puede manejar año/meses sin días. –

Respuesta

15

La respuesta más simple es que una fecha es algo que incluye un día y si no se especifica uno, as.Date() se confunde. De la documentación as.Date:?

Si la cadena de fecha no especifica la fecha por completo, el respuesta devuelta puede ser específico del sistema. El comportamiento más común es suponer que un año, mes o día faltante es el actual. Si especifica una fecha incorrecta, las implementaciones confiables darán un error y la fecha se informará como 'NA' . Desafortunadamente algunas implementaciones comunes (como 'glibc') no son confiables y adivinan el significado previsto.

Cuando lo piense bien, un término como "Mar/1947" no es, estrictamente hablando, una fecha: es solo una combinación de mes y año. Una fecha es un día específico en marzo de 1947 (o en cualquier otro mes + año), ya que no especifica una, no tiene una fecha.

0

No lo sé, pero% b no parece funcionar cuando es el campo principal.

El siguiente todo fallar (dar NA):

> as.Date("Jan/1947", format="%b/%Y") 
> as.Date("Jan 1947", format="%b %Y") 
> as.Date("jan1947", format="%b%Y") 
> as.Date("Jan1947", format="%b%Y") 

mientras que cuando preceden% B% d, funciona:

> as.Date("1Jan1947", format="%d%b%Y") 
> as.Date("29-Jan-1947", format="%d-%b-%Y") 
> as.Date("08/Aug/1947", format="%d/%b/%Y") 
> as.Date("22 Dec 1947", format="%d %b %Y") 

Parece que neilfws tiene la respuesta acerca de lo incompleto. Esto también explicaría por qué dar sólo el año da:

> as.Date("1947", format="%Y") 
[1] "1947-09-19" 
+1

El problema no es que% b sea el campo principal, pero que falta un día. – neilfws

+0

Ahh los downvoters. – smci

8

Es porque d2 en su data.frame es una fecha malformada. No contiene un día. Para evitar esto, puede utilizar el siguiente:

d1$date2 <- as.Date(x=paste("1/",d1$d2, sep=""), format="%d/%b/%Y") 
> d1 
      d  d2  date1  date2 
1 1/Jan/1947 Jan/1947 1947-01-01 1947-01-01 
2 1/Feb/1947 Feb/1947 1947-02-01 1947-02-01 
3 1/Mar/1947 Mar/1947 1947-03-01 1947-03-01 
+0

esto es muy limpio, gracias. – tomw

Cuestiones relacionadas