Разделить информацию о расписании (время начала и окончания) на меньшие интервалы - PullRequest
1 голос
/ 16 июня 2019

Я хочу взять список связанных графиков работы (который включает в себя дату активности, идентификатор пользователя, активность, дату / время начала активности, дату / время окончания активности) и разбить его на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...