用分类变量解包时间数据

时间:2019-08-01 11:41:13

标签: python pandas

我有以下数据框

        site    start_time  end_time    day_week    bike_repair car_repair  touring
0   a1  01/01/1901 11:00    01/01/1901 11:15    Sat_1   1   0   0
1   a2  01/01/1901 11:15    01/01/1901 11:30    Sat_1   0   0   1
2   a3  01/01/1901 11:30    01/01/1901 11:45    Sat_1   1   1   0
3   a4  01/01/1901 11:45    01/01/1901 12:00    Sat_1   1   0   0
4   a5  01/01/1901 12:00    01/01/1901 12:15    Sat_1   0   1   1
5   a6  01/01/1901 12:15    01/01/1901 12:30    Sat_1   1   1   1
6   a7  01/01/1901 12:30    01/01/1901 12:45    Sat_1   1   0   1
7   a8  01/01/1901 12:45    01/01/1901 13:00    Sat_2   0   1   0
8   a9  01/01/1901 13:00    01/01/1901 13:15    Sat_2   0   0   0
9   a10 01/01/1901 13:15    01/01/1901 13:30    Sat_2   1   1   1
10  a11 01/01/1901 13:30    01/01/1901 13:45    Sat_2   1   1   1
11  a12 01/01/1901 13:45    01/01/1901 14:00    Sat_2   1   0   1
12  a13 01/01/1901 14:00    01/01/1901 14:15    Sat_2   0   1   1
13  a14 01/01/1901 14:15    01/01/1901 14:30    Sat_2   0   1   1

请使用pd.read_clipboard(sep='\t')将df读入编辑器。

1表示我在15分钟的间隔内拥有该技能的知识,而0表示我没有。

day_week是指星期几和星期几。

现在,我想了解的是在任何给定时间我拥有什么覆盖范围。我还有另一个数据框,我的店铺的开闭时间我想在经过一些争论后合并到其中。

我从中融化了数据框,它给了我以下内容

(pd.melt(so,id_vars=['site','start_time','end_time','day_week']
,var_name='Skill',value_name='Coverage'))

        site    start_time  end_time    day_week    Skill   Coverage
0   a1  01/01/1901 11:00    01/01/1901 11:15    Sat_1   bike_repair 1
1   a2  01/01/1901 11:15    01/01/1901 11:30    Sat_1   bike_repair 0
2   a3  01/01/1901 11:30    01/01/1901 11:45    Sat_1   bike_repair 1
3   a4  01/01/1901 11:45    01/01/1901 12:00    Sat_1   bike_repair 1
4   a5  01/01/1901 12:00    01/01/1901 12:15    Sat_1   bike_repair 0
5   a6  01/01/1901 12:15    01/01/1901 12:30    Sat_1   bike_repair 1
6   a7  01/01/1901 12:30    01/01/1901 12:45    Sat_1   bike_repair 1
7   a8  01/01/1901 12:45    01/01/1901 13:00    Sat_2   bike_repair 0
8   a9  01/01/1901 13:00    01/01/1901 13:15    Sat_2   bike_repair 0
9   a10 01/01/1901 13:15    01/01/1901 13:30    Sat_2   bike_repair 1
10  a11 01/01/1901 13:30    01/01/1901 13:45    Sat_2   bike_repair 1

这使我接近想要的东西,然后我想使用this帖子中的答案,但是我遇到了以下问题:

融化后的数据为Skill列中的600万行和15种唯一类型

尝试调整答案后出现内存错误,因此可以将其更改为匹配15分钟间隔并求和coverage列?

我正在尝试获得

site    time    day_week    skill   coverage
0   a1  11:00   Sat_1   bike_repair 1
1   a1  11:15   Sat_1   bike_repair 0
2   a1  11:30   Sat_1   bike_repair 1
3   a1  11:45   Sat_1   bike_repair 1
4   a1  12:00   Sat_1   bike_repair 0
5   a1  12:15   Sat_1   bike_repair 1

OR

site    start_time  day_week    skill   Coverage
0   a1  11:01   Sat_1   bike_repair 1
1   a1  11:02   Sat_1   bike_repair 1
2   a1  11:03   Sat_1   bike_repair 1
3   a1  11:04   Sat_1   bike_repair 1
4   a1  11:05   Sat_1   bike_repair 1
5   a1  11:06   Sat_1   bike_repair 1
6   a1  11:07   Sat_1   bike_repair 1
7   a1  11:08   Sat_1   bike_repair 1
8   a1  11:09   Sat_1   bike_repair 1
9   a1  11:10   Sat_1   bike_repair 1
10  a1  11:11   Sat_1   bike_repair 1
11  a1  11:12   Sat_1   bike_repair 1
12  a1  11:13   Sat_1   bike_repair 1
13  a1  11:14   Sat_1   bike_repair 1
14  a1  11:15   Sat_1   bike_repair 0
15  a1  11:16   Sat_1   bike_repair 0
16  a1  11:17   Sat_1   bike_repair 0
17  a1  11:18   Sat_1   bike_repair 0
18  a1  11:19   Sat_1   bike_repair 0

1 个答案:

答案 0 :(得分:1)

我认为您需要:

so['start_time'] = pd.to_datetime(so['start_time'])
so['end_time'] = pd.to_datetime(so['end_time'])

df = (df.groupby(['site','Skill', df['start_time'].dt.time,'day_week'])['Coverage']
        .sum()
        .reset_index())