Python делит интервалы времени на часовые сегменты - PullRequest
0 голосов
/ 10 июня 2019

У меня есть набор данных, как показано ниже, где каждый идентификатор может зарегистрироваться и выйти в любой момент времени и продолжительности

            ID  checkin_datetime    checkout_datetime
            4   04-01-2019 13:07    04-01-2019 13:09
            4   04-01-2019 13:09    04-01-2019 13:12
            4   04-01-2019 14:06    04-01-2019 14:07
            4   04-01-2019 14:55    04-01-2019 15:06
            22  04-01-2019 20:23    04-01-2019 21:32
            22  04-01-2019 21:38    04-01-2019 21:42
            25  04-01-2019 23:22    04-02-2019 00:23
            29  04-02-2019 01:00    04-02-2019 06:15

Проверенные в минутах минуты должны быть разделены на почасовые сегменты, как показано в следующей таблице, чтобы я мог вычислить совокупные итоги по часам для каждого идентификатора по часам и дням, даже когда регистрация на выезд происходит через дней.

Помощь оценена :)

            ID  checkin_datetime    checkout_datetime   day         HR  Minutes
            4   04-01-2019 13:07    04-01-2019 13:09    04-01-2019  13  2
            4   04-01-2019 13:09    04-01-2019 13:12    04-01-2019  13  3
            4   04-01-2019 14:06    04-01-2019 14:07    04-01-2019  14  1
            4   04-01-2019 14:55    04-01-2019 15:06    04-01-2019  14  5
            4   04-01-2019 14:55    04-01-2019 15:06    04-01-2019  15  6
            22  04-01-2019 20:23    04-01-2019 21:32    04-01-2019  20  27
            22  04-01-2019 20:23    04-01-2019 21:32    04-01-2019  21  32
            22  04-01-2019 21:38    04-01-2019 21:42    04-01-2019  21  4
            25  04-01-2019 23:22    04-02-2019 00:23    04-01-2019  23  28
            25  04-01-2019 23:22    04-02-2019 00:23    04-02-2019  0   23
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  1   60
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  2   60
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  3   60
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  4   60
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  5   60
            29  04-02-2019 01:00    04-02-2019 06:15    04-02-2019  6   15

Код для создания кадра данных:

data={'ID':[4,4,4,4,22,22,25,29],
  'checkin_datetime':['04-01-2019 13:07','04-01-2019 13:09','04-01-2019 14:06','04-01-2019 14:55','04-01-2019 20:23'
  ,'04-01-2019 21:38','04-01-2019 23:22','04-02-2019 01:00'],
  'checkout_datetime':['04-01-2019 13:09','04-01-2019 13:12','04-01-2019 14:07','04-01-2019 15:06','04-01-2019 21:32'
                       ,'04-01-2019 21:42','04-02-2019 00:23'
                       ,'04-02-2019 06:15']
}

df = DataFrame(data,columns= ['ID', 'checkin_datetime','checkout_datetime'])

df['checkout_datetime'] = pd.to_datetime(df['checkout_datetime'])
df['checkin_datetime'] = pd.to_datetime(df['checkin_datetime'])

Ответы [ 2 ]

0 голосов
/ 10 июня 2019
import pandas as pd

data={'ID':[4,4,4,4,22,22,25,29],
  'checkin_datetime':['04-01-2019 13:07','04-01-2019 13:09','04-01-2019 14:06','04-01-2019 14:55','04-01-2019 20:23'
  ,'04-01-2019 21:38','04-01-2019 23:22','04-02-2019 01:00'],
  'checkout_datetime':['04-01-2019 13:09','04-01-2019 13:12','04-01-2019 14:07','04-01-2019 15:06','04-01-2019 21:32'
                       ,'04-01-2019 21:42','04-02-2019 00:23'
                       ,'04-02-2019 06:15']
}

df = pd.DataFrame(data,columns= ['ID', 'checkin_datetime','checkout_datetime'])

df['checkout_datetime'] = pd.to_datetime(df['checkout_datetime'])
df['checkin_datetime'] = pd.to_datetime(df['checkin_datetime'])
df['Hour'] = df['checkin_datetime'].apply(lambda x: x.hour)
df['Date'] = df['checkin_datetime'].apply(lambda x: x.date())
df['duration'] = df['checkout_datetime']-df['checkin_datetime']
df['duration_in_minutes'] = (df['checkout_datetime']-df['checkin_datetime'])/pd.Timedelta(minutes=1)
with pd.option_context('display.max_rows', None, 'display.max_columns', None):  # more options can be specified also
    print(df)

Я думаю, что предыдущий ответ, который дал Итамар Мусхкин, абсолютно верен.

0 голосов
/ 10 июня 2019

Довольно просто:
- на время вы просто вычитаете заказ из регистрации (datetime может сделать это).
- Чтобы получить его за несколько минут - разделите его на timedelta одной минуты (я буду использовать встроенную pandas).
- получить час от datetime, вызвать .hour и аналогично .date() для даты (первый - это атрибут, второй - метод - посмотрите в скобках).

df['Hour'] = df['checkin_datetime'].apply(lambda x: x.hour)
df['Date'] = df['checkin_datetime'].apply(lambda x: x.date())
df['duration'] = df['checkout_datetime']-df['checkin_datetime']
df['duration_in_minutes'] = (df['checkout_datetime']-df['checkin_datetime'])/pd.Timedelta(minutes=1)

[Отредактировано]: у меня есть решение разбить продолжительность на часы, но это не самое элегантное ...

df2 = pd.DataFrame(
index=pd.DatetimeIndex(
    start=df['checkin_datetime'].min(),
    end=df['checkout_datetime'].max(),freq='1T'),
    columns = ['is_checked_in','ID'], data=0)

for index, row in df.iterrows():
    df2['is_checked_in'][row['checkin_datetime']:row['checkout_datetime']] = 1
    df2['ID'][row['checkin_datetime']:row['checkout_datetime']] = row['ID']

df3 = df2.resample('1H').aggregate({'is_checked_in': sum,'ID':max})
df3['Hour'] = df3.index.to_series().apply(lambda x: x.hour)
...