2017-01-02 3 views
-3

В моем кадре данных я хочу добавить 5hrs и 30minutes в столбец Time, а затем сгруппировать поле Time на 2 часа (0-2,3-6 .. как это до 21-23). Ниже приведен фрейм данных:Как добавить столбец 05:30 к времени?

Time  Date   Device 
7:12:20 12/14/2016 Tablet 
8:57:34 12/12/2016 Desktop 
18:48:36 12/1/2016  Desktop 
4:27:34 12/16/2016 Desktop 
5:57:48 12/28/2016 Desktop 
10:28:31 12/20/2016 Desktop 
10:28:32 12/20/2016 Desktop 
+1

Благодаря @azzurro –

+0

это дает мне ответ в формате "12H 42m 20S", мне нужно в "чч: мм: сс" –

+0

Что-то вроде этого, возможно, 'библиотеки (данные. Таблица) ; as.ITime (df $ Time) + as.ITime ("5:30") ' –

ответ

1

Это будет один из способов обработки вашего дела. Ваши данные называются здесь mydf. Во-первых, вы можете создать объект даты с использованием paste() и as.POSIXct(). Поскольку вы хотите добавить 2 часа 30 минут, я добавил 60 (сек) * 150 (мин) к объекту даты и создал foo. Затем я извлек час-минута-вторую часть из foo и создал новый столбец под названием Time2. Последнее задание - создать групповую переменную с cut(). Я не знаю, как вы хотите маркировать группы, поэтому я назвал их как группу 1, группу 2 и так далее.

library(dplyr) 

mydf %>% 
mutate(foo = as.POSIXct(paste(Date, Time, sep = " "), 
       format("%m/%d/%Y %H:%M:%S"), tz = "UTC") + 
       (60 * 150), 
     Time2 = format(foo, "%H:%M:%S"), 
     group = cut(as.numeric(format(foo, "%H")), breaks = seq(0, 24, 3), 
        labels = paste("group", 1:8, sep = " "), 
        include.lowest = TRUE)) %>% 
select(-foo) 

#  Time  Date Device Time2 group 
#1 7:12:20 12/14/2016 Tablet 09:42:20 group 3 
#2 8:57:34 12/12/2016 Desktop 11:27:34 group 4 
#3 18:48:36 12/1/2016 Desktop 21:18:36 group 7 
#4 4:27:34 12/16/2016 Desktop 06:57:34 group 2 
#5 5:57:48 12/28/2016 Desktop 08:27:48 group 3 
#6 10:28:31 12/20/2016 Desktop 12:58:31 group 4 
#7 10:28:32 12/20/2016 Desktop 12:58:32 group 4 

DATA

mydf <- structure(list(Time = c("7:12:20", "8:57:34", "18:48:36", "4:27:34", 
"5:57:48", "10:28:31", "10:28:32"), Date = c("12/14/2016", "12/12/2016", 
"12/1/2016", "12/16/2016", "12/28/2016", "12/20/2016", "12/20/2016" 
), Device = c("Tablet", "Desktop", "Desktop", "Desktop", "Desktop", 
"Desktop", "Desktop")), .Names = c("Time", "Date", "Device"), class = "data.frame", row.names = c(NA, 
-7L)) 
+0

Я пробовал, но в Time2 и группе только NA идет –

+0

@Harshkhandelwal Я добавил образцы данных, которые я создал. Ваши реальные данные могут отличаться от моих. Можете ли вы проверить, работает ли мой код с 'mydf'? – jazzurro

+0

Он работает с вашими данными (mydf) –

0

Существует несколько способов сделать это.

Дело 1: Преобразование 5 часов и 30 минут в секундах и добавление их в колонку времени.

* Я должен предпочесть перед добавлением времени т.е. 5hrs и через 30 минут вы должны объединить время и дату столбцов в случае, если у вас есть время около 2100 часов в результате изменения даты *

как только вы присоединиться к столбцы вы продолжите следующее:

dataframe$newtime <- as.POSIXct(dataframe$dateandtimetogether) + noofseconds 

случай 2: определяя функции для часов и минут

в этом случае вам нужно присоединиться столбец даты и времени, а затем его можно легко разделить

hrs <- function(u) { 
    x <- u * 3600 
return(x) 
} 

mns <- function(m) { 
    x <- m * 60 
    return(x) 
} 


dataframe$newtime <- as.POSIXct(dataframe$dateandtimetogether) + hrs(5) + mns(30) 
+0

Это сработало, спасибо. Тем не менее мне нужно сгруппировать время в группу по 2-2 часа. –

2

Что-то вроде:

hms("20:00:00") + hm("5:30") 

собирается выпускать объект, содержащий:

## [1] "25H 30M 0S" 

Не совсем полезно (в данном контексте).

Вот способ, чтобы добавить время и создать разрывы:

df <- read.table(text="Time  Date   Device 
7:12:20 12/14/2016 Tablet 
8:57:34 12/12/2016 Desktop 
18:48:36 12/1/2016  Desktop 
4:27:34 12/16/2016 Desktop 
5:57:48 12/28/2016 Desktop 
10:28:31 12/20/2016 Desktop 
10:28:32 12/20/2016 Desktop", header=TRUE, stringsAsFactors=FALSE) 

library(lubridate) 
library(magrittr) 

(mdy_hms(sprintf("%s %s", df$Date, df$Time)) + hm("5:30")) %>% 
    hour() %>% 
    cut(breaks=seq(0, 24, 2), include.lowest=TRUE) 
## [1] (10,12] (12,14] [0,2] (8,10] (10,12] (14,16] (14,16] 
## 12 Levels: [0,2] (2,4] (4,6] (6,8] (8,10] (10,12] (12,14] ... (22,24] 
+0

Это не работает, я смог добавить часы и минуты, но не смог сгруппировать тогда 2 -2 часа. –

+0

Я изменил 'breaks' и включил вывод, чтобы показать, что он действительно работает. – hrbrmstr

+0

@hrbrmstr Мне нравится идея sprintf. Это удобно. – jazzurro

Смежные вопросы