You can use np.where
to differentiate between waking hours and overnight hours
Creating sample data
data = {
'Date_Time': [
'2017-08-08 00:00:00', '2017-08-08 23:50:01', '2017-08-08 06:45:01',
'2017-08-08 06:00:00', '2017-08-08 00:35:01',
'2017-07-26 00:23:57', '2017-07-26 00:18:57', '2017-07-26 07:13:57',
'2017-07-26 00:08:57', '2017-07-26 07:03:57'
],
'Level': [239.0, 242.0, 246.0, 250.0, 254.0, 72.0, 67.0, 64.0, 64.0, 65.0]
}
df = pd.DataFrame(data, columns=['Date_Time', 'Level'])
df['Date_Time'] = pd.to_datetime(df['Date_Time'])
df = df.set_index('Date_Time')
print(df)
Level
Date_Time
2017-08-08 00:00:00 239.0
2017-08-08 23:50:01 242.0
2017-08-08 06:45:01 246.0
2017-08-08 06:00:00 250.0
2017-08-08 00:35:01 254.0
2017-07-26 00:23:57 72.0
2017-07-26 00:18:57 67.0
2017-07-26 07:13:57 64.0
2017-07-26 00:08:57 64.0
2017-07-26 07:03:57 65.0
Creating a mask of waking hours and overnight hours
mask = (df.index.time >= pd.to_datetime('00:00:00').time()) & (df.index.time <= pd.to_datetime('06:00:00').time())
df['Period'] = np.where(mask, '00:00:00 - 06:00:00', '06:00:01 - 23:59:59')
df
Level Period
Date_Time
2017-08-08 00:00:00 239.0 00:00:00 - 06:00:00
2017-08-08 23:50:01 242.0 06:00:01 - 23:59:59
2017-08-08 06:45:01 246.0 06:00:01 - 23:59:59
2017-08-08 06:00:00 250.0 00:00:00 - 06:00:00
2017-08-08 00:35:01 254.0 00:00:00 - 06:00:00
2017-07-26 00:23:57 72.0 00:00:00 - 06:00:00
2017-07-26 00:18:57 67.0 00:00:00 - 06:00:00
2017-07-26 07:13:57 64.0 06:00:01 - 23:59:59
2017-07-26 00:08:57 64.0 00:00:00 - 06:00:00
2017-07-26 07:03:57 65.0 06:00:01 - 23:59:59
Groupby the Date_Time
and Period
column and calculate average Level
result = df.groupby([df.index.date, 'Period'])['Level'].mean().reset_index()
result.columns = ['Date', 'Time', 'AvgLevel']
result
Date Time AvgLevel
0 2017-07-26 00:00:00 - 06:00:00 67.666667
1 2017-07-26 06:00:01 - 23:59:59 64.500000
2 2017-08-08 00:00:00 - 06:00:00 247.666667
3 2017-08-08 06:00:01 - 23:59:59 244.000000