Создание строк по длительности с использованием панд даты и времени - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблема с написанием кода с использованием даты и времени. Я создал сценарий, над которым я работаю. Может кто-нибудь помочь мне с кодом.

Введите:

Name, Channel, Duration, Start_time
John, A, 2, 16:00:00
Joseph, B, 3, 15:05:00

Выход:

Name, Channel, Duration, Start_time
John, A, 2, 16:00:00
John, A, 2, 16:01:00
Joseph, B, 3, 15:05:00
Joseph, B, 3, 15:06:00
Joseph, B, 3, 15:07:00

Заранее спасибо.

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Использование -

df['dates'] = df.apply(lambda x: list(pd.date_range(start=x['Start_time'], periods=x['Duration'], freq='1min')), axis=1)
df.set_index(['Name','Channel','Duration', 'Start_time'])['dates'].apply(pd.Series).stack().reset_index().drop(['level_4','Start_time'],1).rename(columns={0:'Start_time'})

выход

    Name    Channel Duration    Start_time
0   John    A   3   2018-11-19 16:00:00
1   John    A   3   2018-11-19 16:01:00
2   John    A   3   2018-11-19 16:02:00
3   Joseph  B   4   2018-11-19 15:05:00
4   Joseph  B   4   2018-11-19 15:06:00
5   Joseph  B   4   2018-11-19 15:07:00
6   Joseph  B   4   2018-11-19 15:08:00

Объяснение

  1. Применить pd.date_range() к Start_time и Duration
  2. взорвать это в df со второй строкой
0 голосов
/ 19 ноября 2018

Использование:

df['Start_time'] = pd.to_timedelta(df['Start_time'])
df = df.loc[df.index.repeat(df['Duration'])]
td = pd.to_timedelta(df.groupby(level=0).cumcount() * 60, unit='s')

df['Start_time'] = df['Start_time'] + td
df = df.reset_index(drop=True)

print (df)
     Name Channel  Duration Start_time
0    John       A         2   16:00:00
1    John       A         2   16:01:00
2  Joseph       B         3   15:05:00
3  Joseph       B         3   15:06:00
4  Joseph       B         3   15:07:00

Объяснение

  1. Столбец конвертирования Start_time to_timedelta
  2. Затем repeat значения индекса по столбцу Duration и повтор строк по loc
  3. Создать счетчик по cumcount для значений индекса и преобразовать его в 1-минутные интервалы времени, которые добавляются в новый повторяющийся столбец Start_time
  4. Последний reset_index с параметром drop=True для избежания дублирования значений индекса

EDIT:

Если желаемое время и дата в выходном решении совпадают, только сначала преобразуйте значения to_datetime:

df['Start_time'] = pd.to_datetime(df['Start_time'])
df = df.loc[df.index.repeat(df['Duration'])]
td = pd.to_timedelta(df.groupby(level=0).cumcount() * 60, unit='s')

df['Start_time'] = df['Start_time'] + td
df = df.reset_index(drop=True)
print (df)
     Name Channel  Duration          Start_time
0    John       A         2 2018-11-19 16:00:00
1    John       A         2 2018-11-19 16:01:00
2  Joseph       B         3 2018-11-19 15:05:00
3  Joseph       B         3 2018-11-19 15:06:00
4  Joseph       B         3 2018-11-19 15:07:00
...