es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calcule la diferencia de tiempo entre dos fechas y añádalas en una nueva columna.

Tengo un conjunto de datos con más de 1M de filas. Tiene una fecha de inicio y una fecha de fin utilizando el formato “aaaa-mm-dd hh-mm-ss”.
Deseo añadir una nueva columna al conjunto de datos con la duración del tiempo entre la fecha de fin y la fecha de inicio para cada fila.

Hasta ahora, puedo obtener la diferencia de tiempo utilizando la función “difftime”:

difftime("2020-11-01 13:45:40", "2020-11-01 13:36:00", units = "mins")

Esto me devuelve el siguiente resultado: “Diferencia de tiempo de 9,666667 minutos”, que me gustaría replicar para todo el conjunto de datos de más de 1M de filas.

Para mi prueba, estoy trabajando con una pequeña tabla. Intenté usar la función “mutate” con “rowwise” y “list”. Mi código es el siguiente:

df <- df %>%
  rowwise() %>%
  mutate(trip_duration = list((difftime(as.Date(df$`end time`), as.Date(df$`start time`), units = "mins"))))

Esto proporciona el siguiente resultado:

# A tibble: 3 x 3

# Rowwise:
  `start time`     `end time`       trip_duration
  <chr>            <chr>            <list>       
1 2020-11-01 13:36 2020-11-01 13:45 <drtn [3]="">   
2 2020-11-01 13:36 2020-11-01 13:45 <drtn [3]="">   
3 2020-11-01 13:36 2020-11-01 13:45 <drtn [3]=""> 

La nueva columna no muestra lo que estoy buscando, simplemente muestra el número “3” para cada fila sin importar si pido el resultado en minutos, segundos o incluso horas, y ahora estoy atascado tratando de encontrar la forma de hacer el cálculo.

Gracias de antemano a cualquiera que pueda ayudar, ¡saludos!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, podemos usar la función mutate del paquete dplyr para crear una nueva columna en el conjunto de datos que contenga la diferencia de tiempo entre las fechas de inicio y fin. Podemos usar la función as.POSIXct para convertir las cadenas de fecha al formato POSIXct, lo que nos permite realizar operaciones aritméticas en las fechas. Aquí tienes un ejemplo de código que debería funcionar:

    “`{r}
    library(dplyr)

    suponiendo que el conjunto de datos está almacenado en un marco de datos llamado “my_data”

    my_data %>%
    mutate(start_date = as.POSIXct(start_date),
    end_date = as.POSIXct(end_date),
    duration = difftime(end_date, start_date, units = “mins”))


    Este código primero convierte las columnas `start_date` y `end_date` al formato POSIXct utilizando la función `as.POSIXct`. Luego, usamos la función `difftime` para calcular la diferencia entre las columnas `end_date` y `start_date` en minutos, y guardamos el resultado en una nueva columna llamada `duration`. Ten en cuenta que no es necesario utilizar `rowwise()` o `list()` en este código, ya que `mutate()` ya aplica la función a cada fila del conjunto de datos. Este código debería funcionar para conjuntos de datos con más de 1 millón de filas, ya que `dplyr` está diseñado para trabajar eficientemente con conjuntos de datos grandes. Sin embargo, si encuentras que el código se está ejecutando demasiado lento, es posible que quieras considerar el uso del paquete `data.table`, ya que es aún más rápido para conjuntos de datos grandes. Aquí tienes un ejemplo de código utilizando `data.table`: ```{r} library(data.table) # suponiendo que el conjunto de datos está almacenado en una tabla de datos llamada "my_data" setDT(my_data) my_data[, duration := difftime(as.POSIXct(end_date), as.POSIXct(start_date), units = "mins")]

    Este código funciona de manera similar al código dplyr, pero utiliza la sintaxis de data.table. Primero convertimos las columnas start_date y end_date al formato POSIXct utilizando as.POSIXct, y luego utilizamos el operador := para crear una nueva columna llamada duration que contiene la diferencia de tiempo en minutos. Una vez más, no es necesario utilizar rowwise() o list() en este código.

    ¡Espero que esto te ayude! Déjame saber si tienes alguna otra pregunta.

Comments are closed.