假设我有一个非常大的数据框,如下所示:
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)
此外,我并不喜欢嵌套语句,因为它们在大型数据帧上工作得非常慢。
答案 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'])]
)