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

Resuelto Hemmik asked hace 54 años • 2 respuestas

Cuando intento analizar una marca de tiempo en el siguiente formato: "Jueves 8 de noviembre 15:41:45 2012", solo NAse devuelve.

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

Cuando lo intento strptime, NAse devuelve:

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

Tampoco as.POSIXctfunciona:

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

También probé as.Datela cadena de arriba pero sin %H:%M:%Scomponentes:

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

¿Alguna idea de qué podría estar haciendo mal?

Hemmik avatar Jan 01 '70 08:01 Hemmik
Aceptado

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

Detalles

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

%b: Nombre abreviado del mes 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 Cconfiguración regional deben ser las tres primeras letras del nombre en inglés en mayúscula:"

"Saber cuáles son las abreviaturas es esencial si desea utilizar %a, %bo %hcomo parte de un formato de entrada: consulte los ejemplos para saber cómo comprobarlo".

Ver también

[...] localesconsultar o establecer una ubicación.

La cuestión de localeses relevante también para as.POSIXct, as.POSIXlty as.Date.

De ?as.POSIXct:

Detalles

Si formatse especifica, recuerde que algunas de las especificaciones de formato son específicas de la configuración regional y es posible que deba configurar la LC_TIMEcategoría adecuadamente a través de Sys.setlocale. Esto afecta con mayor frecuencia al uso de %b, %B(nombres de meses) y %p(AM/PM).

De ?as.Date:

Detalles

Cuando sea apropiado y esté disponible, se utilizan conversiones específicas de la configuración regional hacia y desde cadenas de caracteres. Esto afecta a los nombres de los días y meses.


Por lo tanto, si los nombres de los días de la semana y los meses en la cadena difieren de los de la configuración regional actual, strptimeno as.POSIXctse as.Datepuede analizar la cadena correctamente y NAse devuelve.

Sin embargo, puede resolver este problema cambiando 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 (e.g "Thu") and abbreviated month (e.g "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 tu error:

Sys.setlocale("LC_TIME", loc)
# [1] "fr_FR.UTF-8"

strptime(var,"%a %b %d %H:%M:%S %Y")
# [1] NA
plannapus avatar Dec 05 '2012 15:12 plannapus

Simplemente estaba jugando con el mismo problema y descubrí que esta solución es mucho más limpia porque no hay necesidad de cambiar ninguna configuración del sistema manualmente, porque hay una función contenedora que hace este trabajo en el lubridatepaquete, y todo lo que tienes que hacer es configurar el argumento locale:

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"
m_c avatar Feb 05 '2017 10:02 m_c