如何将 05:30 添加到时间列?
How to add 05:30 to Time column?
在我的数据框中,我想将 5 小时 30 分钟添加到时间列,然后将时间字段分组为 2 小时(0-2,3-6.. 像这样直到 21-23)。这是下面的数据框:
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
有多种方法。
案例一:将5小时30分换算成秒,加入时间列
*我必须更喜欢在添加时间之前,即 5 小时 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)
类似于:
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]
这将是处理您的案件的一种方式。您的数据在这里被称为 mydf
。首先,您可以使用 paste()
和 as.POSIXct()
创建一个日期对象。因为要加上2小时30分钟,所以我给date对象加了60(sec)*150(min),创建了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
数据
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))
在我的数据框中,我想将 5 小时 30 分钟添加到时间列,然后将时间字段分组为 2 小时(0-2,3-6.. 像这样直到 21-23)。这是下面的数据框:
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
有多种方法。
案例一:将5小时30分换算成秒,加入时间列
*我必须更喜欢在添加时间之前,即 5 小时 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)
类似于:
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]
这将是处理您的案件的一种方式。您的数据在这里被称为 mydf
。首先,您可以使用 paste()
和 as.POSIXct()
创建一个日期对象。因为要加上2小时30分钟,所以我给date对象加了60(sec)*150(min),创建了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
数据
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))