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 de datatable 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, utilizar as.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á usando as.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.

InformationsquelleAutor phil_t | 2017-10-17

2 Comentarios

  1. 7

    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:

    xx <- rep("10/17/2017 12:00:00 AM", 5000000) # test input
    system.time(as.Date(xx, "%m/%d/%Y"))
    ## user  system elapsed 
    ## 9.57    0.20    9.82 
    • Esto ya fue sugerido por @Henrik como un comentario…
  2. 0

    Que podría ser más eficiente para convertir de Date a character:

    # Create dummy data
    date_from <- as.Date('01/01/1999  12:00:00 AM',
        format = "%m/%d/%Y %I:%M:%S %p")
    
    date_to <- as.Date('01/01/2017  12:00:00 AM',
        format = "%m/%d/%Y %I:%M:%S %p")
    
    df <- data.frame(ReportDate = sample(seq(from = date_from,
        to = date_to, by = "day"), 5000000, T))
    
    # Convert to char
    start <- Sys.time()
    df$ReportDate <- as.character(df$ReportDate)
    
    Sys.time() - start
    Time difference of 12.37254 secs
    
    head(df)
      ReportDate
    1 2011-08-04
    2 2013-11-15
    3 2002-09-08
    4 2011-07-01
    5 2011-01-22
    6 2001-01-04
    • Que necesito para mantenerlo como Date para otras operaciones de ahí el final de la conversión de uso de as.Date()
    • Veo, que no estaba del todo claro de la cuestión. Yo había pasado por alto que inicialmente tienen los datos almacenados como character y no Date, así que tiene sentido usar @Henriks solución.

Dejar respuesta

Please enter your comment!
Please enter your name here