将时间分成小组

时间:2018-04-19 10:36:18

标签: r datetime

假设我有一个非常大的数据框,如下所示:

Row   Time
1     01:15:12
2     09:18:22
3     21:56:01
4     13:33:23
5     11:59:56
6     17:08:38
7     21:55:16

我知道00:00-08:00之间的时间是班次1,08:00-16:00之间的时间是班次2,而时间是16:00-00:00是班次3。我可以制作一个快速工作的代码,将时间值转换为1,2和3移位?

这样的事情:

Row   Time      Shift
1     01:15:12  1
2     09:18:22  2
3     21:56:01  3
4     13:33:23  2
5     11:59:56  2
6     17:08:38  3
7     21:55:16  3

我已经尝试在这个question中用Dirk的答案做出一些事情,但时间没有正确转换(有时01:15:12改为22:00:00,有时改为10:00:00)

此外,我并不喜欢嵌套语句,因为它们在大型数据帧上工作得非常慢。

1 个答案:

答案 0 :(得分:1)

我们可以使用library(tidyverse); df %>% mutate( Time = as.POSIXct(Time, format = "%H:%M:%S"), Shift = cut( Time, breaks = as.POSIXct(c("00:00", "08:00", "16:00", "24:00"), format = "%H:%M"), labels = c("1", "2", "3"))) # Row Time Shift #1 1 2018-04-19 01:15:12 1 #2 2 2018-04-19 09:18:22 2 #3 3 2018-04-19 21:56:01 3 #4 4 2018-04-19 13:33:23 2 #5 5 2018-04-19 11:59:56 2 #6 6 2018-04-19 17:08:38 3 #7 7 2018-04-19 21:55:16 3

df <- read.table(text =
    "Row   Time
1     01:15:12
2     09:18:22
3     21:56:01
4     13:33:23
5     11:59:56
6     17:08:38
7     21:55:16", header = T)

请注意,这取决于您修改过的数据。

样本数据

import networkx as nx
import itertools

G = nx.Graph()
G.add_nodes_from(df.id)
G.add_edges_from(
    [(r1[1]['id'], r2[1]['id']) for (r1, r2) in itertools.product(df.iterrows(), df.iterrows()) if r1[1].id < r2[1].id and (r1[1]['rate'] == r2[1]['rate'] or r1[1]['name'] == r2[1]['name'])]
)