strptime, as.POSIXct y as.Date devuelven NA inesperado
Cuando intento analizar una marca de tiempo en el siguiente formato: "Jueves 8 de noviembre 15:41:45 2012", solo NA
se 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
, NA
se devuelve:
var <- "Thu Nov 8 15:41:45 2012"
strptime(var, "%a %b %d %H:%M:%S %Y")
# [1] NA
Tampoco as.POSIXct
funciona:
as.POSIXct(var, "%a %b %d %H:%M:%S %Y")
# [1] NA
También probé as.Date
la cadena de arriba pero sin %H:%M:%S
componentes:
as.Date("Thu Nov 8 2012", "%a %b %d %Y")
# [1] NA
¿Alguna idea de qué podría estar haciendo mal?
Creo que es exactamente como lo adivinaste, strptime
no 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
C
configuració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
,%b
o%h
como parte de un formato de entrada: consulte los ejemplos para saber cómo comprobarlo".Ver también
[...]
locales
consultar o establecer una ubicación.
La cuestión de locales
es relevante también para as.POSIXct
, as.POSIXlt
y as.Date
.
De ?as.POSIXct
:
Detalles
Si
format
se especifica, recuerde que algunas de las especificaciones de formato son específicas de la configuración regional y es posible que deba configurar laLC_TIME
categoría adecuadamente a través deSys.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, strptime
no as.POSIXct
se as.Date
puede analizar la cadena correctamente y NA
se 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
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 lubridate
paquete, 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"