根据时间间隔的小时创建时间列类别
Create time of day column categories based on hour of time interval
我正在尝试创建一个“一天中的时间”列,我在其中根据小时将一天中的时间分类为多个部分。例如,从 20:00-21:59 开始的任何时间都属于“20-22”类别。我计划在不同的时间间隔(例如两小时的时间间隔、3 小时的时间间隔等)多次执行此操作。但是,间隔并不总是从零开始。例如,3 小时间隔将为:“02-05”、“05-08”、“08-11”等。这使得很难定义如何为分类切割数据。
这是我的数据示例:
library(lubridate)
library(chron)
table <- "ID date time
1 1 2016-04-30 21:00:00
2 2 2016-04-30 23:15:00
3 3 2016-04-30 19:30:00
4 4 2016-04-30 17:45:00
5 5 2016-04-30 14:00:00
6 6 2016-04-30 13:15:00
7 7 2016-04-30 05:30:00
8 8 2016-04-30 07:45:00
9 9 2016-04-30 09:00:00
10 10 2016-04-30 13:15:00
11 11 2016-04-30 10:30:00
12 12 2016-04-30 11:45:00
13 13 2016-05-01 12:00:00
14 14 2016-05-01 00:15:00
15 15 2016-05-01 01:30:00
16 16 2016-05-01 03:45:00
17 17 2016-05-01 04:00:00
18 18 2016-05-01 06:15:00
19 19 2016-05-01 19:30:00
20 20 2016-05-01 20:00:00"
# Create dataframe
df <- read.table(text=table, header = TRUE)
# Change time format
df$time <- times(df$time)
# Add hour
df$hour <- hour(hms(df$time))
str(df)
我尝试了该站点的各种资源,但结果数据总是有一些问题。以下是我尝试过的细目:
- 下面的代码不起作用,因为任何正好在整点的时间(例如本例中的 20:00:00)都会进入它之前的类别 (18-20),而不是它应该属于的类别在(20-22)中。此代码也不适用于 3 小时间隔。
breaks <- c(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24) / 24
labels <- c("00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22", "22-00")
df$tod <- cut(df$time, breaks, labels, include.lowest = TRUE)
- 此代码不起作用,因为它会在一个类别中产生一些时间的 NA 值(例如 23:15:00)。
breaks2 <- hour(hm("02:00", "04:00", "06:00", "08:00", "10:00", "12:00", "14:00", "16:00",
"18:00", "20:00", "22:00", "00:00", "01:59"))
labels2 <- c("22-00", "00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22")
df$tod2 <- cut(x=df$hour, breaks=breaks2, labels=labels2, include.lowest=TRUE)
如有任何帮助,我们将不胜感激!
您的第一次尝试失败,因为您正在寻找 right = FALSE
设置,而不是 include.lowest
,它只影响最低的 bin。除以 24 时可能 运行 会出现浮点精度问题,所以我认为直接剪切 hour
列最简单:
df$hour <- hour(hms(df$time))
hr_breaks = seq(0, 24, by = 2)
hr_labels <- c("00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22", "22-00")
df$tod = cut(df$hour, breaks = hr_breaks,
labels = hr_labels,
include.lowest = T, right = F)
df
# ID date time hour tod
# 1 1 2016-04-30 21:00:00 21 20-22
# 2 2 2016-04-30 23:15:00 23 22-00
# 3 3 2016-04-30 19:30:00 19 18-20
# 4 4 2016-04-30 17:45:00 17 16-18
# 5 5 2016-04-30 14:00:00 14 12-14
# 6 6 2016-04-30 13:15:00 13 12-14
# 7 7 2016-04-30 05:30:00 5 04-06
# 8 8 2016-04-30 07:45:00 7 06-08
# 9 9 2016-04-30 09:00:00 9 08-10
# 10 10 2016-04-30 13:15:00 13 12-14
# 11 11 2016-04-30 10:30:00 10 08-10
# 12 12 2016-04-30 11:45:00 11 10-12
# 13 13 2016-05-01 12:00:00 12 10-12
# 14 14 2016-05-01 00:15:00 0 00-02
# 15 15 2016-05-01 01:30:00 1 00-02
# 16 16 2016-05-01 03:45:00 3 02-04
# 17 17 2016-05-01 04:00:00 4 02-04
# 18 18 2016-05-01 06:15:00 6 04-06
# 19 19 2016-05-01 19:30:00 19 18-20
# 20 20 2016-05-01 20:00:00 20 18-20
我正在尝试创建一个“一天中的时间”列,我在其中根据小时将一天中的时间分类为多个部分。例如,从 20:00-21:59 开始的任何时间都属于“20-22”类别。我计划在不同的时间间隔(例如两小时的时间间隔、3 小时的时间间隔等)多次执行此操作。但是,间隔并不总是从零开始。例如,3 小时间隔将为:“02-05”、“05-08”、“08-11”等。这使得很难定义如何为分类切割数据。
这是我的数据示例:
library(lubridate)
library(chron)
table <- "ID date time
1 1 2016-04-30 21:00:00
2 2 2016-04-30 23:15:00
3 3 2016-04-30 19:30:00
4 4 2016-04-30 17:45:00
5 5 2016-04-30 14:00:00
6 6 2016-04-30 13:15:00
7 7 2016-04-30 05:30:00
8 8 2016-04-30 07:45:00
9 9 2016-04-30 09:00:00
10 10 2016-04-30 13:15:00
11 11 2016-04-30 10:30:00
12 12 2016-04-30 11:45:00
13 13 2016-05-01 12:00:00
14 14 2016-05-01 00:15:00
15 15 2016-05-01 01:30:00
16 16 2016-05-01 03:45:00
17 17 2016-05-01 04:00:00
18 18 2016-05-01 06:15:00
19 19 2016-05-01 19:30:00
20 20 2016-05-01 20:00:00"
# Create dataframe
df <- read.table(text=table, header = TRUE)
# Change time format
df$time <- times(df$time)
# Add hour
df$hour <- hour(hms(df$time))
str(df)
我尝试了该站点的各种资源,但结果数据总是有一些问题。以下是我尝试过的细目:
- 下面的代码不起作用,因为任何正好在整点的时间(例如本例中的 20:00:00)都会进入它之前的类别 (18-20),而不是它应该属于的类别在(20-22)中。此代码也不适用于 3 小时间隔。
breaks <- c(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24) / 24
labels <- c("00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22", "22-00")
df$tod <- cut(df$time, breaks, labels, include.lowest = TRUE)
- 此代码不起作用,因为它会在一个类别中产生一些时间的 NA 值(例如 23:15:00)。
breaks2 <- hour(hm("02:00", "04:00", "06:00", "08:00", "10:00", "12:00", "14:00", "16:00",
"18:00", "20:00", "22:00", "00:00", "01:59"))
labels2 <- c("22-00", "00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22")
df$tod2 <- cut(x=df$hour, breaks=breaks2, labels=labels2, include.lowest=TRUE)
如有任何帮助,我们将不胜感激!
您的第一次尝试失败,因为您正在寻找 right = FALSE
设置,而不是 include.lowest
,它只影响最低的 bin。除以 24 时可能 运行 会出现浮点精度问题,所以我认为直接剪切 hour
列最简单:
df$hour <- hour(hms(df$time))
hr_breaks = seq(0, 24, by = 2)
hr_labels <- c("00-02", "02-04", "04-06", "06-08", "08-10", "10-12", "12-14", "14-16",
"16-18", "18-20", "20-22", "22-00")
df$tod = cut(df$hour, breaks = hr_breaks,
labels = hr_labels,
include.lowest = T, right = F)
df
# ID date time hour tod
# 1 1 2016-04-30 21:00:00 21 20-22
# 2 2 2016-04-30 23:15:00 23 22-00
# 3 3 2016-04-30 19:30:00 19 18-20
# 4 4 2016-04-30 17:45:00 17 16-18
# 5 5 2016-04-30 14:00:00 14 12-14
# 6 6 2016-04-30 13:15:00 13 12-14
# 7 7 2016-04-30 05:30:00 5 04-06
# 8 8 2016-04-30 07:45:00 7 06-08
# 9 9 2016-04-30 09:00:00 9 08-10
# 10 10 2016-04-30 13:15:00 13 12-14
# 11 11 2016-04-30 10:30:00 10 08-10
# 12 12 2016-04-30 11:45:00 11 10-12
# 13 13 2016-05-01 12:00:00 12 10-12
# 14 14 2016-05-01 00:15:00 0 00-02
# 15 15 2016-05-01 01:30:00 1 00-02
# 16 16 2016-05-01 03:45:00 3 02-04
# 17 17 2016-05-01 04:00:00 4 02-04
# 18 18 2016-05-01 06:15:00 6 04-06
# 19 19 2016-05-01 19:30:00 19 18-20
# 20 20 2016-05-01 20:00:00 20 18-20