Измените время (ЧЧ:ММ:СС) на дату (ГГГГ-ММ-ДД) , равную полуночи в R

#r #date #datetime

Вопрос:

Я пытаюсь преобразовать время в ЧЧ:ММ:СС на сегодняшний день в ГГГГ-ММ-ДД в R с учетом полуночи.

Время длится с утра 1-го дня до утра 2-го дня, но я хотел создать новую колонку с определенной датой, в которой время после полуночи будет указывать на новый день. Вот пример:

Текущие данные:

 structure(list(ID = c("ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", "ID_002", 
"ID_002", "ID_002", "ID_002", "ID_002"), Time = c("05:01:00", 
"06:01:00", "07:01:00", "08:01:00", "09:01:00", "10:01:00", "11:01:00", 
"12:01:00", "13:01:00", "14:01:00", "15:01:00", "16:01:00", "17:01:00", 
"18:01:00", "19:01:00", "20:01:00", "21:01:00", "22:01:00", "23:01:00", 
"00:01:00", "01:01:00", "02:01:00", "03:01:00", "04:01:00", "05:01:00", 
"06:01:00", "07:01:00", "08:01:00", "09:01:00")), row.names = c(NA, 
29L), class = "data.frame")
 

Желаемый результат:

 ID      Time Date
ID_001  08:01:00    2021-01-20
ID_001  10:01:00    2021-01-20
ID_001  12:01:00    2021-01-20
ID_001  14:01:00    2021-01-20
ID_001  16:01:00    2021-01-20
ID_001  18:01:00    2021-01-20
ID_001  20:01:00    2021-01-20
ID_001  22:01:00    2021-01-20
ID_001  00:01:00    2021-01-21
ID_001  02:01:00    2021-01-21
ID_001  04:01:00    2021-01-21
ID_001  06:01:00    2021-01-21
ID_001  08:01:00    2021-01-21
 

Спасибо за вашу помощь!

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

1. Пожалуйста , добавьте данные в вопрос, используя выходные dput(sample_data) данные, это облегчает копирование и тестирование решений. Спасибо. Что входит в данные для определения даты? Это значит, что вы знаете, что первый раз для ID-001 приходится на 20/01/2021 и что все последующие времена являются последовательными с этого момента?

2. Спасибо, Питер. Да, именно так! С этого момента все идет последовательно.

Ответ №1:

Комбинация dplyr и lubridate-это возможный способ получить то, что вы хотите.

Сначала определите, наступил ли новый день, проверив, является ли разница в запаздывающем времени отрицательной. Если это так, добавьте день к первому дню. Затем используйте a cumsum , чтобы добавить все дни к дате начала.

 library(dplyr)
library(lubridate)
first_date <- ymd("2021-01-20")

df1 %>% 
  mutate(add_a_day = if_else(hms(Time) - lag(hms(Time), default = hms("00:00:00")) < 0, 1, 0),
         Date = first_date   cumsum(add_a_day)
         ) %>% 
  select(-add_a_day)

       ID     Time       Date
1  ID_002 05:01:00 2021-01-20
2  ID_002 06:01:00 2021-01-20
3  ID_002 07:01:00 2021-01-20
4  ID_002 08:01:00 2021-01-20
5  ID_002 09:01:00 2021-01-20
6  ID_002 10:01:00 2021-01-20
7  ID_002 11:01:00 2021-01-20
8  ID_002 12:01:00 2021-01-20
9  ID_002 13:01:00 2021-01-20
10 ID_002 14:01:00 2021-01-20
11 ID_002 15:01:00 2021-01-20
12 ID_002 16:01:00 2021-01-20
13 ID_002 17:01:00 2021-01-20
14 ID_002 18:01:00 2021-01-20
15 ID_002 19:01:00 2021-01-20
16 ID_002 20:01:00 2021-01-20
17 ID_002 21:01:00 2021-01-20
18 ID_002 22:01:00 2021-01-20
19 ID_002 23:01:00 2021-01-20
20 ID_002 00:01:00 2021-01-21
21 ID_002 01:01:00 2021-01-21
22 ID_002 02:01:00 2021-01-21
23 ID_002 03:01:00 2021-01-21
24 ID_002 04:01:00 2021-01-21
25 ID_002 05:01:00 2021-01-21
26 ID_002 06:01:00 2021-01-21
27 ID_002 07:01:00 2021-01-21
28 ID_002 08:01:00 2021-01-21
29 ID_002 09:01:00 2021-01-21
 

Ответ №2:

Это подойдет?

 library(tidyverse)
starting_date <- as.Date('2021-01-20')
library(lubridate)

df %>% 
  mutate(Date = starting_date   cumsum(lag(hms(Time), default = hms('00:00:01')) > hms(Time) ))

#>        ID     Time       Date
#> 1  ID_002 05:01:00 2021-01-20
#> 2  ID_002 06:01:00 2021-01-20
#> 3  ID_002 07:01:00 2021-01-20
#> 4  ID_002 08:01:00 2021-01-20
#> 5  ID_002 09:01:00 2021-01-20
#> 6  ID_002 10:01:00 2021-01-20
#> 7  ID_002 11:01:00 2021-01-20
#> 8  ID_002 12:01:00 2021-01-20
#> 9  ID_002 13:01:00 2021-01-20
#> 10 ID_002 14:01:00 2021-01-20
#> 11 ID_002 15:01:00 2021-01-20
#> 12 ID_002 16:01:00 2021-01-20
#> 13 ID_002 17:01:00 2021-01-20
#> 14 ID_002 18:01:00 2021-01-20
#> 15 ID_002 19:01:00 2021-01-20
#> 16 ID_002 20:01:00 2021-01-20
#> 17 ID_002 21:01:00 2021-01-20
#> 18 ID_002 22:01:00 2021-01-20
#> 19 ID_002 23:01:00 2021-01-20
#> 20 ID_002 00:01:00 2021-01-21
#> 21 ID_002 01:01:00 2021-01-21
#> 22 ID_002 02:01:00 2021-01-21
#> 23 ID_002 03:01:00 2021-01-21
#> 24 ID_002 04:01:00 2021-01-21
#> 25 ID_002 05:01:00 2021-01-21
#> 26 ID_002 06:01:00 2021-01-21
#> 27 ID_002 07:01:00 2021-01-21
#> 28 ID_002 08:01:00 2021-01-21
#> 29 ID_002 09:01:00 2021-01-21
 

Создано в 2021-11-27 с помощью пакета reprex (v2.0.0)

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

1. Спасибо Фиверу и АнилГоялу, оба способа работают!