Tengo una columna con fechas de caracteres en el formato de 10/17/2017 12:00:00 AM
. Quiero mantener sólo la parte de la fecha es decir 2017-10-17
. Estoy usando –
df$ReportDate = as.Date(df$ReportDate, format = "%m/%d/%Y %I:%M:%S %p")
df$ReportDate = as.Date(format(df$ReportDate, "%Y-%m-%d"))
esto funciona, pero el dataframe tiene más de 5 millones de filas para esto, toma cerca de dos minutos.
user system elapsed
104.73 0.55 105.46
Hay un más rápido y más eficiente manera de hacer esto?
- Un archivo de excel tiene más de 5 m filas? Estoy adivinando su archivo csv. trate de usar
fread
dedatatable
paquete - Lo siento, creo que mi pregunta no fue claro. No es el proceso de lectura que toma tiempo, pero la fecha de proceso de conversión. Va a editar.
- Es esta para los cálculos o para la presentación de informes. Sus dos líneas de código de retorno equivalente vectores, al menos para mí.
df <- rep("8/31/2017 12:30:00 pm", 5e6); df <- as.Date(df, format = "%m/%d/%Y %I:%M:%S %p"); df1 <- as.Date(format(df, "%Y-%m-%d")); all(df == df1)
- Usted podría utilizar
substr
para extraer sólo la parte de la fecha – dejar el tiempo atrás y, a continuación, utilizaras.Date(df$ReportDate, format = "%m/%d/%Y)
puede ser más rápido sin necesidad de analizar el tiempo así – no estoy seguro. Tampoco estoy seguro de por qué usted está usandoas.Date
dos veces. No es una vez es suficiente? - Lo siento, ¿por qué no probar con
strptime
- También me gustaría sugerir un dupe: hay un rápido analizador para la Fecha?. La respuesta sugiere una aproximadamente 2x speedup el uso de la
fasttime
paquete. as.Date("10/17/2017 12:00:00 AM", format = "%m/%d/%Y")
es suficiente. «Cada cadena de entrada se procesa la medida de lo necesario para el formato especificado: cualquier trailing se ignoran los caracteres.»- Yo uso como.Fecha de dos veces, porque las fechas son almacenados originalmente en el tipo de carácter (el dataframe es importada con fread). Así que la primera conversión convierte a la fecha de objetos. Yo, a continuación, extraiga la fecha con
format
, que convierte el tipo de carácter. Ya que la necesito como un objeto date para otras operaciones, que uso como.La fecha de una segunda vez para convertir a la fecha de objetos. - Que funciona! Y se tarda 4 segundos, por lo que alrededor de 25 veces más rápido. Si el post como respuesta, voy a aceptar.
- La segunda conversión es redundante. Como usted dice, la primera conversión se convierte en un objeto Date. La exacta misma Fecha, con objeto de que su segunda línea de conversos.
Nota que
as.Date
ignorará la basura después de la fecha por lo que este tarda menos de 10 segundos en mi, no es especialmente rápido portátil:Que podría ser más eficiente para convertir de
Date
acharacter
:Date
para otras operaciones de ahí el final de la conversión de uso deas.Date()
character
y noDate
, así que tiene sentido usar @Henriks solución.