Я хочу взять список связанных графиков работы (который включает в себя дату активности, идентификатор пользователя, активность, дату / время начала активности, дату / время окончания активности) и разбить его на 30-минутные интервалы, начиная с часа и получасаи перечислите общее время для этого действия, включенного в этот интервал.
Учитывая ...
>>> print(df)
activity_date user_id activity activity_start_time activity_end_time
11-Jun bob phones 06/11/2019 8:00 06/11/2019 9:00
11-Jun bob break 06/11/2019 9:00 06/11/2019 9:15
11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
11-Jun bob lunch 06/11/2019 11:15 06/11/2019 12:15
Я бы хотел, чтобы это был результат ...
>>> print(df)
interval_start time_in_interval activity_date user_id activity activity_start_time activity_end_time
06/11/2019 8:00 30 11-Jun bob phones 06/11/2019 8:00 06/11/2019 9:00
06/11/2019 8:30 30 11-Jun bob phones 06/11/2019 8:00 06/11/2019 9:00
06/11/2019 9:00 15 11-Jun bob break 06/11/2019 9:00 06/11/2019 9:15
06/11/2019 9:00 15 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 9:30 30 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 10:00 30 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 10:30 30 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 11:00 30 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 11:30 30 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
06/11/2019 12:00 15 11-Jun bob phones 06/11/2019 9:15 06/11/2019 11:15
2 новых столбца (начало интервала и время в интервале) плюс добавлены новые строки, чтобы действия отображались соответствующим образом в каждом интервале.Я все еще хочу увидеть оригинальное редактирование Start & End Times
edit: это то, что я имею до сих пор.Это будет ...
- создать таблицу всех интервалов (каждые 30 минут).
- объединить со списком userid-даты, чтобы создать таблицу всех интервалов для всех дат, для которых идентификатор пользователя имел расписание
- объединить это с исходным фреймом данных.
В этот момент у меня есть таблица со всеми интервалами для всех идентификаторов пользователей, и интервал, в котором начинается действие, правильно помечен.Но если действие не начинается с интервала (например, действие начинается в 9:15 вместо 9:00 или 9:30), тогда время начала интервала равно нулю.И все промежуточные интервалы есть, кроме нуля (например, активность, которая начинается в 9; 00 и продолжается до 10:00 ... указан интервал 9:30, но информация об активности равна нулю
Что осталось ...
- , если время начала интервала равно нулю (поэтому активность не начинается в час или полчаса), обновите его, указав правильное время начала интервала. У меня есть функция для этой сортировки
- по идентификатору пользователя, времени начала активности, времени интервала и прохладной информации об активности вниз, чтобы заполнить информацию о деятельности (например, взять информацию за 9: 00-10: 00 и обновить интервал 9:30)
Я простознаю, что должен быть лучший способ ....
import numpy as np
import pandas as pd
import datetime
from pandas import Series, DataFrame
#
# insert code to a create dataframe as df
# df has schedule data as documented elsewhere
#
#Create interval List
interval_list = list(range(0, 48))
start_of_day = datetime(2019,1,1,0,0,0)
interval_times = pd.DataFrame()
for x in interval_list:
minutes_into_day = x * 30
start_of_interval = (start_of_day + timedelta(minutes=minutes_into_day)).time()
interval_times = interval_times.append(pd.DataFrame({'interval_start': start_of_interval, 'joiner': 'joiner'}, index=[0]), ignore_index=True)
interval_times['joiner'] = 'joiner'
#Create id_date List
id_date = df.groupby(['user_id', 'date'], as_index=False)['activity'].count().copy()
id_date = id_date.drop('activity', axis=1)
id_date['joiner'] = 'joiner'
id_date
#merge Interval & ID_date
user_ids_interval_date_times = pd.merge(interval_times, id_date)
user_ids_interval_date_times['activity_start_time'] = user_ids_interval_date_times.apply(lambda r : pd.datetime.combine(r['date'],r['interval_start']),1)
#merge with df
df_temp = pd.merge(df, user_ids_interval_date_times, how='outer')
#if interval is null, then update with interval floor
def floor_dt(dt, delta):
return datetime.datetime.min + math.ceil((dt - datetime.datetime.min) / delta) * delta - delta
#Sort by ID & activity_start_time
#copy everything down
df_temp