Используйте numpy.select
с Series.apply
для маски возврата по значениям столбца:
df = pd.DataFrame({'date':['2019-10-1 01:00:10',
'2019-10-2 14:00:10',
'2019-10-31 19:00:10',
'2019-10-31 06:00:10']})
df['time'] = pd.to_datetime(df['date']).dt.time
print(df)
date time
0 2019-10-1 01:00:10 01:00:10
1 2019-10-2 14:00:10 14:00:10
2 2019-10-31 19:00:10 19:00:10
3 2019-10-31 06:00:10 06:00:10
m1 = df['time'].apply(lambda x: is_time_between(time(5,0), time(12,59), x))
m2 = df['time'].apply(lambda x: is_time_between(time(13,0), time(17,59), x))
m3 = df['time'].apply(lambda x: is_time_between(time(18,0), time(23,59), x))
df['day_interval'] = np.select([m1, m2, m3], [1,2,3], default=4)
Другое решение с cut
и преобразование времени в timedeltas на to_timedelta
:
bins = pd.to_timedelta(['00:00:00','05:00:00','13:00:00','18:00:00','23:59:59'])
df['day_interval1'] = pd.cut(pd.to_timedelta(df['time'].astype(str)), bins, labels=[4,1,2,3])
print (df)
date time day_interval day_interval1
0 2019-10-1 01:00:10 01:00:10 4 4
1 2019-10-2 14:00:10 14:00:10 2 2
2 2019-10-31 19:00:10 19:00:10 3 3
3 2019-10-31 06:00:10 06:00:10 1 1