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.

Cómo crear una nueva columna con marcas de tiempo, utilizando una columna antigua de fecha/hora en formato de 24 horas.

Tengo un data frame con una columna que contiene la fecha y hora. He extraído el mes y el día para crear 2 nuevas columnas, pero ahora estoy intentando crear otra columna con la hora y no funciona ahora que he convertido mi hora al formato de 24 horas.

Aquí está cómo se ve la columna en mi data frame:

df
  <dttm>
1 2021-06-01 08:00:00
2 2021-06-01 08:15:00
3 2021-06-01 08:30:00
4 2021-06-01 08:45:00
5 2021-11-25 21:46:40
6 2021-11-25 22:01:40

Aquí está el data frame de la columna:

df = structure(list(df = structure(c(1622552400, 1622553300, 1622554200, 
                                     1622555100, 1637894800, 1637895700), class = c("POSIXct", "POSIXt"
                                     ), tzone = "EST")), row.names = c(NA, 6L), class = "data.frame")

Cuando mi hora estaba en formato de 12 horas, usaba este código y funcionaba:

mutate(month = lubridate::month(Date_Time_GMT_3), 
         year = lubridate::year(Date_Time_GMT_3),
         day = lubridate::day(Date_Time_GMT_3))

CODIGO PARA LA COLUMNA DE TIEMPO:

time = lubridate::hms(substr(Date_Time_GMT_3, 11, nchar(Date_Time_GMT_3)))

Ahora que he cambiado el formato de mi hora a 24 horas, obtengo este error:

Advertencia:
Problema con la columna “time” en “mutate()”.
i “time = lubridate::hms(substr(Date_Time_GMT_3, 11, nchar(Date_Time_GMT_3)))”.
i Algunas cadenas no se pudieron parsear o todas las cadenas son NA.

¿Alguna idea de cómo solucionar esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Es probable que la función hms no pueda interpretar correctamente el formato de hora en formato de 24 horas. Una forma de solucionar esto es utilizar la función parse_date_time del paquete lubridate en lugar de hms. parse_date_time te permite especificar el formato de la cadena de fecha/hora, lo cual puede ser útil al tratar con diferentes formatos.

    Aquí tienes un ejemplo de código que debería funcionar con tu marco de datos:

    library(lubridate)
    
    # convertir la fecha/hora a una cadena de caracteres para facilitar su manejo
    df$df <- as.character(df$df)
    
    # extraer mes, día y año
    df <- df %>%
      mutate(month = month(df),
             year = year(df),
             day = day(df))
    
    # extraer hora - esto asume que la hora está en el formato "HH:MM:SS"
    df <- df %>%
      mutate(time = parse_date_time(substr(df, 12, 19), "HMS"))
    
    # convertir de nuevo al formato POSIXct si es necesario
    df$df <- as.POSIXct(df$df)
    

    En este código, primero convertimos la columna de fecha/hora en una cadena de caracteres para poder trabajar con subcadenas. Luego extraemos el mes, día y año como antes. Para la columna de hora, utilizamos substr para extraer la subcadena que comienza en la posición 12 (que debería ser el inicio de la cadena de tiempo) y termina en la posición 19 (que debería ser el final de la cadena de tiempo). Luego utilizamos parse_date_time para convertir esta subcadena en un objeto de fecha/hora. Ten en cuenta que especificamos el formato de la cadena de tiempo (que es “HMS” para “horas:minutos:segundos”). Por último, convertimos la columna de fecha/hora de nuevo al formato POSIXct si es necesario.

    Este código debería funcionar independientemente de si tu hora está en formato de 12 horas o de 24 horas.

Comments are closed.