Как разделить временные данные в Python?

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

У меня есть фрейм данных, как показано ниже:

 d={
    'Date' :['2016-10-30','2016-10-30','2016-11-01','2016-10-30'],
    'Time':['09:58:11', '10:05:34', '10:07:57', '11:15:32'],
    'Transaction':[2,3,1,1]
}

df=pd.DataFrame(d, columns=['Date','Time','Transaction'])
 

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

Мне нужно создать новую переменную как Time_Group . Для (6,11] — это «Утро», для (11,17] — «День», а для (17,20] — «Вечер» для данных Time_group . Как создать эту переменную с помощью столбца времени?

Ответ №1:

Использование pd.cut с pd.Timedelta :

 u = df.assign(Time=pd.to_timedelta(df['Time']))
bins = [6,11,17,20]
labels = ['Morning','Afternoon','Evening']
u = u.assign(Time_Group=pd.cut(u['Time'],[pd.Timedelta(hours=i) for i in bins],
                               labels=labels))
 

 print(u)
         Date     Time  Transaction Time_Group
0  2016-10-30 09:58:11            2    Morning
1  2016-10-30 10:05:34            3    Morning
2  2016-11-01 10:07:57            1    Morning
3  2016-10-30 11:15:32            1  Afternoon
 

Комментарии:

1. Здравствуйте, здесь 4-й raw должен быть утром, но, похоже, днем. Как это исправить?

2. @user14815110 в своем вопросе вы написали, что 11-17 должно быть днем. Следовательно, 4-я строка — вторая половина дня, так как прошло 15 минут 11.to измените время вы можете просто изменить список ячеек с 11 на 12 например, чтобы начать вторую половину дня с

Ответ №2:

Вы можете использовать это —

 d={
    'Date' :['2016-10-30','2016-10-30','2016-11-01','2016-10-30'],
    'Time':['09:58:11', '10:05:34', '10:07:57', '11:15:32'],
    'Transaction':[2,3,1,1]
}

df=pd.DataFrame(d, columns=['Date','Time','Transaction'])


def time_group(inp):
    inp = datetime.datetime.strptime(inp[0], "%H:%M:%S")
    a = datetime.datetime.strptime("06:00:00", "%H:%M:%S")
    b = datetime.datetime.strptime("11:00:00", "%H:%M:%S")
    c = datetime.datetime.strptime("17:00:00", "%H:%M:%S")
    d = datetime.datetime.strptime("20:00:00", "%H:%M:%S")
    
    if a < inp <= b:
       return 'Morning'
    elif b < inp < c:
       return 'Afternoon'
    elif c < inp < d:
       return 'Night'

>>> df[['Time']].apply(time_group,axis=1)
0      Morning
1      Morning
2      Morning
3    Afternoon
dtype: object