У меня есть список устройств и их продолжительность (время начала и окончания). Устройство может иметь один или несколько журналов активности. Я пытаюсь создать дистрибутив для каждого устройства, когда устройство было активным.Заполнение часовых поясов во время действия - Python
Моего текущий dataframe выглядит примерно так:
device_id start_time end_time
1 03:53 10:54
1 06:00 14:00
2 20:29 06:17
Чтобы создать распределение времени активности для каждого устройства, я думал, что я хотел бы создать почасовое ведро (соответствующие часы с 00 до 23) и заполнить ведра, где устройство было активным. Таким образом, для устройства 1, например, первая строка будет
[0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
и второй ряд
[0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
добавляя их, чтобы создать распределение активности для устройства 1 даст:
[0,0,0,1,1,1,2,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0]
У меня была следующая попытка создания необходимых списков, однако она работает только в том случае, если конечное время больше, чем время начала (например, первые две строки в примере данных выше) и не будет работать для времени запуска больше, чем времени окончания (например, строка 3 в примере данных выше).
for start, end in zip(df[df['start_time'].notnull() & df['end_time'].notnull()]['start_time'],df[df['start_time'].notnull() & df['end_time'].notnull()]['end_time']) :
start_time = pd.to_datetime(start, format ='%H:%M')
end_time = pd.to_datetime(end, format ='%H:%M')
activity = [0]*24
i = (start_time + dt.timedelta(minutes=((start_time.minute // 60 + (1 if start_time.minute>30 else 0)) * 60) - start_time.minute)).hour
rounded_end_time = (end_time + dt.timedelta(minutes=((end_time.minute // 60 + (1 if end_time.minute>30 else 0)) * 60) - end_time.minute)).hour
while i < rounded_end_time:
activity[i] = 1
i = i + 1
print activity
Любые предложения по исправлению? (Или более разумный способ для выполнения этой задачи в первую очередь?)
Как вы интерпретируете строку, где время начала больше, чем время окончания? То есть что это на самом деле представляет с точки зрения реальной информации? – 8one6
@ 8one6 означает, что устройство работает на ночь. Третья строка, например, должна заполнить первые 6 индексов и последние 4 в часовых ведрах. – Fate