strptime, as.POSIXct y as.Date return inesperado NA

Cuando bash analizar una marca de tiempo en el siguiente formato: “Jue Nov 8 15:41:45 2012”, solo se devuelve NA .

Estoy usando Mac OS X, R 2.15.2 y Rstudio 0.97.237. El lenguaje de mi sistema operativo es holandés: supongo que esto tiene algo que ver con eso.

Cuando bash strptime , NA se devuelve:

 var <- "Thu Nov 8 15:41:45 2012" strptime(var, "%a %b %d %H:%M:%S %Y") # [1] NA 

Tampoco lo hace como. as.POSIXct trabajo:

 as.POSIXct(var, "%a %b %d %H:%M:%S %Y") # [1] NA 

También probé como. as.Date la cadena anterior pero sin %H:%M:%S componentes:

 as.Date("Thu Nov 8 2012", "%a %b %d %Y") # [1] NA 

¿Alguna idea de lo que podría estar haciendo mal?

    Creo que es exactamente como lo has adivinado, strptime no analiza la cadena de fecha y hora debido a tus configuraciones regionales. Su cadena contiene el día de la semana abreviado ( %a ) y el nombre del mes abreviado ( %b ). Estas especificaciones de tiempo se describen en ?strptime :

    Detalles

    %a : nombre abreviado de día de la semana en la configuración regional actual en esta plataforma

    %b : nombre de mes abreviado en la configuración regional actual en esta plataforma .

    “Tenga en cuenta que los nombres abreviados son específicos de la plataforma (aunque los estándares especifican que en la configuración regional C deben ser las tres primeras letras del nombre en inglés en mayúsculas:”

    “Saber cuáles son las abreviaturas es esencial si desea utilizar %a , %b o %h como parte de un formato de entrada: consulte los ejemplos de cómo verificarlo”.

    Ver también

    […] locales para consultar o establecer una configuración regional.

    El problema de los locales también es relevante para as.POSIXct , as.POSIXlt y as.Date .

    Desde ?as.POSIXct :

    Detalles

    Si se especifica el format , recuerde que algunas de las especificaciones de formato son específicas de la configuración regional, y es posible que deba establecer la categoría LC_TIME adecuada a través de Sys.setlocale . Esto a menudo afecta el uso de %b , %B (nombres de mes) y %p (AM / PM).

    Desde ?as.Date :

    Detalles

    Las conversiones locales específicas hacia y desde cadenas de caracteres se usan cuando corresponde y están disponibles. Esto afecta los nombres de los días y meses.


    Por lo tanto, si los días de la semana y los nombres de los meses en la cadena difieren de los de la configuración regional actual, strptime , as.POSIXct y as.Date no pueden analizar la cadena correctamente y se devuelve NA .

    Sin embargo, puede resolver este problema cambiando las locales :

     # First save your current locale loc < - Sys.getlocale("LC_TIME") # Set correct locale for the strings to be parsed # (in this particular case: English) # so that weekdays (eg "Thu") and abbreviated month (eg "Nov") are recognized Sys.setlocale("LC_TIME", "en_GB.UTF-8") # or Sys.setlocale("LC_TIME", "C") #Then proceed as you intended x <- "Thu Nov 8 15:41:45 2012" strptime(x, "%a %b %d %H:%M:%S %Y") # [1] "2012-11-08 15:41:45" # Then set back to your old locale Sys.setlocale("LC_TIME", loc) 

    Con mi configuración regional personal, puedo reproducir su error:

     Sys.setlocale("LC_TIME", loc) # [1] "fr_FR.UTF-8" strptime(var,"%a %b %d %H:%M:%S %Y") # [1] NA 

    Solo estaba jugando con el mismo problema, y ​​encontré que esta solución es mucho más limpia porque no hay necesidad de cambiar ninguna de las configuraciones del sistema manualmente, porque hay una función envoltura haciendo este trabajo en el paquete lubridate , y todo lo que tiene que hacer es establecer la locale del argumento:

     date < - c("23. juni 2014", "1. november 2014", "8. marts 2014", "16. juni 2014", "12. december 2014", "13. august 2014") df$date <- dmy(df$Date, locale = "Danish") [1] "2014-06-23" "2014-11-01" "2014-03-08" "2014-06-16" "2014-12-12" "2014-08-13"