I have a dataset with the exact time and quantity of e-vehicles charging at a charging station and its charging power in kW.
What I am trying to do is to calculate how many e-vehicles are charging at the exact same time (taking into account start and end times), and according to that, calculate the required charging power (sum up the power_kW) needed for each hour. For example, from 18-19h I need only 100kW of power.
Below I shared a part of the data, I obviously have the data for all the 24 hours, and for each hour I should have a total needed charging station power in kW.
Obviously, if one vehicle finishes charging at 20:50, and another one starts at 20:50 - they overlap and I need to count 2*power_kW. Also, in some slots, I have more than 1 vehicle starting and finishing at the same time.
I find it hard to do it fast and automatically with the code, given that the times are in hour:minute format, so I seek help here. I checked similar posts and couldn't find anything to bring me to a solution on my own.
Does someone have an idea how to do this efficently and correctly?
Input data:
import pandas as pd
mycolumns = ['start_timeslot', 'start', 'end', 'power_kW', 'vehicle_count']
data = [['18H-19H', '18:26', '20:27', 100, 1], ['19H-20H', '19:06', '21:16', 100, 1],
['19H-20H', '19:19', '21:16', 100, 1], ['19H-20H', '19:36', '21:33', 100, 1],
['19H-20H', '19:54', '20:19', 100, 2], ['19H-20H', '19:55', '22:01', 100, 1],
['20H-21H', '20:04', '22:06', 100, 1], ['20H-21H', '20:11', '22:04', 100, 2],
['20H-21H', '20:15', '22:04', 100, 1], ['20H-21H', '20:16', '22:04', 100, 1],
['20H-21H', '20:17', '22:08', 100, 1], ['20H-21H', '20:19', '22:09', 100, 1],
['20H-21H', '20:20', '22:01', 100, 2], ['20H-21H', '20:22', '22:35', 100, 1],
['20H-21H', '20:28', '22:34', 100, 2], ['20H-21H', '20:29', '22:22', 100, 1],
['20H-21H', '20:30', '22:14', 100, 1], ['20H-21H', '20:31', '22:10', 100, 1],
['20H-21H', '20:37', '22:31', 100, 1], ['20H-21H', '20:41', '22:29', 100, 2],
['20H-21H', '20:43', '22:34', 100, 1], ['20H-21H', '20:46', '22:39', 100, 1],
['20H-21H', '20:47', '22:35', 100, 1], ['20H-21H', '20:52', '22:34', 100, 1],
['20H-21H', '20:52', '23:09', 100, 1], ['20H-21H', '20:53', '21:59', 100, 1],
['20H-21H', '20:54', '21:49', 100, 1], ['20H-21H', '20:56', '22:10', 100, 1],
['20H-21H', '20:56', '22:55', 100, 1], ['21H-22H', '21:03', '22:51', 100, 1],
['21H-22H', '21:05', '23:12', 100, 1], ['21H-22H', '21:08', '22:59', 100, 1],
['21H-22H', '21:10', '23:27', 100, 1], ['21H-22H', '21:10', '23:30', 100, 1],
['21H-22H', '21:15', '23:23', 100, 1], ['21H-22H', '21:19', '21:56', 100, 1],
['21H-22H', '21:21', '22:48', 100, 1], ['21H-22H', '21:25', '23:26', 100, 1],
['21H-22H', '21:25', '23:32', 100, 1], ['21H-22H', '21:27', '22:55', 100, 1],
['21H-22H', '21:27', '23:32', 100, 1], ['21H-22H', '21:33', '23:11', 100, 1],
['21H-22H', '21:37', '23:04', 100, 1], ['21H-22H', '21:39', '00:05', 100, 1],
['21H-22H', '21:40', '23:08', 100, 1], ['21H-22H', '21:45', '23:04', 100, 1],
['21H-22H', '21:49', '00:06', 100, 1], ['21H-22H', '21:54', '00:07', 100, 1],
['21H-22H', '21:58', '00:02', 100, 1], ['21H-22H', '21:58', '00:24', 100, 1],
['22H-23H', '22:10', '00:19', 100, 1]]
df = pd.DataFrame(data, columns=mycolumns)
df
start_timeslot start end power_kW vehicle_count
0 18H-19H 18:26 20:27 100 1
1 19H-20H 19:06 21:16 100 1
2 19H-20H 19:19 21:16 100 1
3 19H-20H 19:36 21:33 100 1
4 19H-20H 19:54 20:19 100 2
5 19H-20H 19:55 22:01 100 1
6 20H-21H 20:04 22:06 100 1
7 20H-21H 20:11 22:04 100 2
8 20H-21H 20:15 22:04 100 1
9 20H-21H 20:16 22:04 100 1
10 20H-21H 20:17 22:08 100 1
11 20H-21H 20:19 22:09 100 1
12 20H-21H 20:20 22:01 100 2
13 20H-21H 20:22 22:35 100 1
14 20H-21H 20:28 22:34 100 2
15 20H-21H 20:29 22:22 100 1
16 20H-21H 20:30 22:14 100 1
17 20H-21H 20:31 22:10 100 1
18 20H-21H 20:37 22:31 100 1
19 20H-21H 20:41 22:29 100 2
20 20H-21H 20:43 22:34 100 1
21 20H-21H 20:46 22:39 100 1
22 20H-21H 20:47 22:35 100 1
23 20H-21H 20:52 22:34 100 1
24 20H-21H 20:52 23:09 100 1
25 20H-21H 20:53 21:59 100 1
26 20H-21H 20:54 21:49 100 1
27 20H-21H 20:56 22:10 100 1
28 20H-21H 20:56 22:55 100 1
29 21H-22H 21:03 22:51 100 1
30 21H-22H 21:05 23:12 100 1
31 21H-22H 21:08 22:59 100 1
32 21H-22H 21:10 23:27 100 1
33 21H-22H 21:10 23:30 100 1
34 21H-22H 21:15 23:23 100 1
35 21H-22H 21:19 21:56 100 1
36 21H-22H 21:21 22:48 100 1
37 21H-22H 21:25 23:26 100 1
38 21H-22H 21:25 23:32 100 1
39 21H-22H 21:27 22:55 100 1
40 21H-22H 21:27 23:32 100 1
41 21H-22H 21:33 23:11 100 1
42 21H-22H 21:37 23:04 100 1
43 21H-22H 21:39 00:05 100 1
44 21H-22H 21:40 23:08 100 1
45 21H-22H 21:45 23:04 100 1
46 21H-22H 21:49 00:06 100 1
47 21H-22H 21:54 00:07 100 1
48 21H-22H 21:58 00:02 100 1
49 21H-22H 21:58 00:24 100 1
50 22H-23H 22:10 00:19 100 1
Expected output should be:
start_timeslot needed_power_kW
0 18H-19H 100
1 19H-20H 700
2 20H-21H 3100
3 21H-22H 4600
4 22H-23H 4600
5 23H-00H 1800
6 00H-01H 600
I am adding an example from the real dataset, because with the proposed solutions I cannot get the correct answer for all options.
mycolumns = ['start_timeslot', 'start', 'end', 'power_kW', 'vehicle_count']
data = [['00H-01H', '00:05', '00:09', 200.0, 1],
['00H-01H', '00:35', '00:39', 200.0, 1],
['01H-02H', '01:05', '01:09', 200.0, 1],
['05H-06H', '05:34', '05:41', 200.0, 1],
['05H-06H', '05:54', '06:01', 200.0, 1],
['06H-07H', '06:20', '06:27', 200.0, 1],
['06H-07H', '06:44', '06:47', 200.0, 1],
['06H-07H', '06:59', '07:06', 200.0, 1],
['07H-08H', '07:18', '07:22', 200.0, 1],
['07H-08H', '07:36', '07:40', 200.0, 1],
['07H-08H', '07:49', '07:56', 200.0, 1],
['08H-09H', '08:01', '08:05', 200.0, 1],
['08H-09H', '08:08', '08:14', 200.0, 1],
['08H-09H', '08:14', '08:20', 200.0, 1],
['08H-09H', '08:21', '08:26', 200.0, 1],
['08H-09H', '08:28', '08:35', 200.0, 1],
['08H-09H', '08:35', '08:42', 200.0, 1],
['08H-09H', '08:42', '08:46', 200.0, 1],
['08H-09H', '08:49', '08:56', 200.0, 1],
['08H-09H', '08:55', '09:02', 200.0, 1],
['08H-09H', '09:00', '09:04', 200.0, 1],
['09H-10H', '09:07', '09:13', 200.0, 1],
['09H-10H', '09:13', '09:20', 200.0, 1],
['09H-10H', '09:25', '09:29', 200.0, 1],
['09H-10H', '09:31', '09:36', 200.0, 1],
['09H-10H', '09:37', '09:42', 200.0, 1],
['09H-10H', '09:43', '09:47', 200.0, 1],
['09H-10H', '09:49', '09:56', 200.0, 1],
['09H-10H', '09:55', '10:02', 200.0, 1],
['10H-11H', '10:01', '10:05', 200.0, 1],
['10H-11H', '10:06', '10:13', 200.0, 1],
['10H-11H', '10:12', '10:16', 200.0, 1],
['10H-11H', '10:18', '10:23', 200.0, 1],
['10H-11H', '10:23', '10:27', 200.0, 1],
['10H-11H', '10:29', '10:33', 200.0, 1],
['10H-11H', '10:35', '10:39', 200.0, 1],
['10H-11H', '10:41', '10:45', 200.0, 1],
['10H-11H', '10:47', '10:52', 200.0, 1],
['10H-11H', '10:53', '10:57', 200.0, 1],
['10H-11H', '10:59', '11:03', 200.0, 1],
['11H-12H', '11:05', '11:09', 200.0, 1],
['11H-12H', '11:11', '11:15', 200.0, 1],
['11H-12H', '11:17', '11:21', 200.0, 1],
['11H-12H', '11:23', '11:27', 200.0, 1],
['11H-12H', '11:29', '11:33', 200.0, 1],
['11H-12H', '11:35', '11:39', 200.0, 1],
['11H-12H', '11:41', '11:46', 200.0, 1],
['11H-12H', '11:47', '11:51', 200.0, 1],
['11H-12H', '11:53', '11:57', 200.0, 1],
['11H-12H', '11:59', '12:03', 200.0, 1],
['12H-13H', '12:05', '12:09', 200.0, 1],
['12H-13H', '12:11', '12:15', 200.0, 1],
['12H-13H', '12:17', '12:21', 200.0, 1],
['12H-13H', '12:22', '12:26', 200.0, 1],
['12H-13H', '12:28', '12:33', 200.0, 1],
['12H-13H', '12:33', '12:37', 200.0, 1],
['12H-13H', '12:38', '12:43', 200.0, 1],
['12H-13H', '12:43', '12:47', 200.0, 1],
['12H-13H', '12:49', '12:53', 200.0, 1],
['12H-13H', '12:55', '12:59', 200.0, 1],
['13H-14H', '13:01', '13:05', 200.0, 1],
['13H-14H', '13:07', '13:12', 200.0, 1],
['13H-14H', '13:13', '13:17', 200.0, 1],
['13H-14H', '13:19', '13:23', 200.0, 1],
['13H-14H', '13:25', '13:29', 200.0, 1],
['13H-14H', '13:31', '13:35', 200.0, 1],
['13H-14H', '13:37', '13:41', 200.0, 1],
['13H-14H', '13:43', '13:47', 200.0, 1],
['13H-14H', '13:49', '13:53', 200.0, 1],
['13H-14H', '13:55', '13:59', 200.0, 1],
['14H-15H', '14:01', '14:06', 200.0, 1],
['14H-15H', '14:07', '14:11', 200.0, 1],
['14H-15H', '14:13', '14:17', 200.0, 1],
['14H-15H', '14:19', '14:23', 200.0, 1],
['14H-15H', '14:25', '14:29', 200.0, 1],
['14H-15H', '14:31', '14:35', 200.0, 1],
['14H-15H', '14:37', '14:41', 200.0, 1],
['14H-15H', '14:42', '14:46', 200.0, 1],
['14H-15H', '14:48', '14:52', 200.0, 1],
['14H-15H', '14:54', '14:58', 200.0, 1],
['14H-15H', '14:59', '15:03', 200.0, 1],
['15H-16H', '15:04', '15:08', 200.0, 1],
['15H-16H', '15:09', '15:13', 200.0, 1],
['15H-16H', '15:15', '15:19', 200.0, 1],
['15H-16H', '15:21', '15:25', 200.0, 1],
['15H-16H', '15:27', '15:31', 200.0, 1],
['15H-16H', '15:33', '15:37', 200.0, 1],
['15H-16H', '15:39', '15:43', 200.0, 1],
['15H-16H', '15:45', '15:49', 200.0, 1],
['15H-16H', '15:51', '15:55', 200.0, 1],
['15H-16H', '15:57', '16:01', 200.0, 1],
['16H-17H', '16:03', '16:07', 200.0, 1],
['16H-17H', '16:09', '16:13', 200.0, 1],
['16H-17H', '16:15', '16:19', 200.0, 1],
['16H-17H', '16:21', '16:27', 200.0, 1],
['16H-17H', '16:27', '16:31', 200.0, 1],
['16H-17H', '16:33', '16:37', 200.0, 1],
['16H-17H', '16:39', '16:43', 200.0, 1],
['16H-17H', '16:45', '16:49', 200.0, 1],
['16H-17H', '16:51', '16:55', 200.0, 1],
['16H-17H', '16:57', '17:01', 200.0, 1],
['17H-18H', '17:04', '17:08', 200.0, 1],
['17H-18H', '17:10', '17:14', 200.0, 1],
['17H-18H', '17:16', '17:20', 200.0, 1],
['17H-18H', '17:22', '17:26', 200.0, 1],
['17H-18H', '17:28', '17:32', 200.0, 1],
['17H-18H', '17:34', '17:38', 200.0, 1],
['17H-18H', '17:40', '17:44', 200.0, 1],
['17H-18H', '17:46', '17:50', 200.0, 1],
['17H-18H', '17:51', '17:55', 200.0, 1],
['17H-18H', '17:57', '18:01', 200.0, 1],
['18H-19H', '18:03', '18:07', 200.0, 1],
['18H-19H', '18:09', '18:13', 200.0, 1],
['18H-19H', '18:15', '18:19', 200.0, 1],
['18H-19H', '18:21', '18:25', 200.0, 1],
['18H-19H', '18:27', '18:31', 200.0, 1],
['18H-19H', '18:33', '18:37', 200.0, 1],
['18H-19H', '18:39', '18:43', 200.0, 1],
['18H-19H', '18:45', '18:49', 200.0, 1],
['18H-19H', '18:51', '18:55', 200.0, 1],
['18H-19H', '18:57', '19:01', 200.0, 1],
['19H-20H', '19:04', '19:08', 200.0, 1],
['19H-20H', '19:11', '19:15', 200.0, 1],
['19H-20H', '19:18', '19:22', 200.0, 1],
['19H-20H', '19:25', '19:29', 200.0, 1],
['19H-20H', '19:32', '19:36', 200.0, 1],
['19H-20H', '19:39', '19:43', 200.0, 1],
['19H-20H', '19:46', '19:50', 200.0, 1],
['19H-20H', '19:52', '19:56', 200.0, 1],
['20H-21H', '20:07', '20:11', 200.0, 1],
['20H-21H', '20:13', '20:17', 200.0, 1],
['20H-21H', '20:20', '20:24', 200.0, 1],
['20H-21H', '20:28', '20:32', 200.0, 1],
['20H-21H', '20:35', '20:39', 200.0, 1],
['20H-21H', '20:42', '20:46', 200.0, 1],
['20H-21H', '20:49', '20:53', 200.0, 1],
['20H-21H', '20:55', '20:59', 200.0, 1],
['21H-22H', '21:10', '21:14', 200.0, 1],
['21H-22H', '21:23', '21:24', 200.0, 1],
['21H-22H', '21:39', '21:43', 200.0, 1],
['22H-23H', '22:08', '22:12', 200.0, 1],
['22H-23H', '22:38', '22:42', 200.0, 1],
['23H-00H', '23:08', '23:12', 200.0, 1],
['23H-00H', '23:36', '23:40', 200.0, 1]]
df = pd.DataFrame(data, columns=mycolumns)

