Удаление времени из столбца Дата Время в R

#r

Вопрос:

Как удалить время из столбцов Даты и времени в фрейме данных, упомянутом ниже:

 gt; structure(list(hhenrid = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L,  12L, 13L, 14L, 15L, 18L, 19L, 20L, 21L, 22L, 23L, 24L), dob = c("1/1/1970 12:00:00 AM",  "1/1/1976 12:00:00 AM", "1/1/1983 12:00:00 AM", "1/1/1980 12:00:00 AM",  "12/31/1966 12:00:00 AM", "1/1/1990 12:00:00 AM", "1/1/1993 12:00:00 AM",  "1/1/1959 12:00:00 AM", "12/31/1984 12:00:00 AM", "12/31/1969 12:00:00 AM",  "12/31/1968 12:00:00 AM", "1/1/1979 12:00:00 AM", "12/31/1958 12:00:00 AM",  "12/31/1986 12:00:00 AM", "1/1/1978 12:00:00 AM", "12/31/1987 12:00:00 AM",  "12/31/1987 12:00:00 AM", "12/31/1967 12:00:00 AM", "12/31/1993 12:00:00 AM",  "1/1/1953 12:00:00 AM"), voedate = c("7/28/2018 12:00:00 AM",  "7/24/2018 12:00:00 AM", "7/24/2018 12:00:00 AM", "8/3/2018 12:00:00 AM",  "7/22/2018 12:00:00 AM", "8/3/2018 12:00:00 AM", "7/23/2018 12:00:00 AM",  "7/24/2018 12:00:00 AM", "7/10/2018 12:00:00 AM", "7/30/2018 12:00:00 AM",  "7/30/2018 12:00:00 AM", "7/20/2018 12:00:00 AM", "7/24/2018 12:00:00 AM",  "7/27/2018 12:00:00 AM", "7/31/2018 12:00:00 AM", "7/18/2018 12:00:00 AM",  "7/27/2018 12:00:00 AM", "8/1/2018 12:00:00 AM", "8/1/2018 12:00:00 AM",  "8/1/2018 12:00:00 AM")), row.names = c(NA, 20L), class = "data.frame")  

Я пытаюсь с помощью этого кода удалить время из столбцов Даты и времени:

hh111$doblt;-format(as.POSIXct(hh111$dob, format = '%d/%m/%Y %H:%M:%S'), format = '%d/%m/%Y')

Но он показывает только даты, которые имеют 01/01/ГГГГ и NA для других значений. Нужна помощь, чтобы удалить время из обоих столбцов Даты и времени, т. Е. dob и voedate.

Комментарии:

1. Ваш dob , похоже, в формате mdy, но вы пытаетесь использовать формат dmy в своем as.POSIXct звонке. Изменение этого на format(as.POSIXct(hh111$dob, format = '%m/%d/%Y %H:%M:%S'), format = '%d/%m/%Y') должно дать вам то, что вы хотите.

Ответ №1:

Одним из способов было бы использовать str_split :

 library(tidyverse) dat %gt;% mutate(across(c(dob, voedate), ~str_split(., " ", simplify=T)[,1]))  
 hhenrid dob voedate 1 2 1/1/1970 7/28/2018 2 3 1/1/1976 7/24/2018 3 4 1/1/1983 7/24/2018 4 5 1/1/1980 8/3/2018 5 6 12/31/1966 7/22/2018 6 7 1/1/1990 8/3/2018 7 8 1/1/1993 7/23/2018 8 10 1/1/1959 7/24/2018 9 11 12/31/1984 7/10/2018 10 12 12/31/1969 7/30/2018 11 13 12/31/1968 7/30/2018 12 14 1/1/1979 7/20/2018 13 15 12/31/1958 7/24/2018 14 18 12/31/1986 7/27/2018 15 19 1/1/1978 7/31/2018 16 20 12/31/1987 7/18/2018 17 21 12/31/1987 7/27/2018 18 22 12/31/1967 8/1/2018 19 23 12/31/1993 8/1/2018 20 24 1/1/1953 8/1/2018  

Ответ №2:

Превращение их в даты также сократит время:

 library(dplyr) df1 %gt;%   mutate(across(c(dob, voedate), ~ as.Date(., format("%m/%d/%Y"))))   hhenrid dob voedate 1 2 1970-01-01 2018-07-28 2 3 1976-01-01 2018-07-24 3 4 1983-01-01 2018-07-24 4 5 1980-01-01 2018-08-03 5 6 1966-12-31 2018-07-22 6 7 1990-01-01 2018-08-03 7 8 1993-01-01 2018-07-23 8 10 1959-01-01 2018-07-24 9 11 1984-12-31 2018-07-10 10 12 1969-12-31 2018-07-30 11 13 1968-12-31 2018-07-30 12 14 1979-01-01 2018-07-20 13 15 1958-12-31 2018-07-24 14 18 1986-12-31 2018-07-27 15 19 1978-01-01 2018-07-31 16 20 1987-12-31 2018-07-18 17 21 1987-12-31 2018-07-27 18 22 1967-12-31 2018-08-01 19 23 1993-12-31 2018-08-01 20 24 1953-01-01 2018-08-01  

Ответ №3:

 library(lubridate)  df$datetime lt;- lubridate::mdy_hms(df$voedate, tz="Europe/London")