Чтобы быть более поучительным, я немного расширил ваши исходные данные, чтобы они
содержит полные наборы 5 чтений для 2 устройств.
Я также решил изменить столбец date
на истинные даты.
Концепция основана на группировании по device
, а затем генерации
даты начала / окончания каждой группы.
Сценарий, генерирующий периоды начала / окончания, может быть следующим:
import pandas as pd
# Source data
df = pd.DataFrame(data={ 'device': [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 ],
'date': [ '06/16', '07/16', '08/16', '09/17', '10/17',
'03/16', '04/16', '11/16', '12/16', '01/17' ],
'performance': [ 50.4, 54, 6, 67, 56, 50, 45, 30, 72.3, 42 ] })
# Convert date to true dates
df.date = pd.to_datetime(df.date, format='%m/%y')
grp = df.groupby(by='device')
# Starts of periods
st = grp.apply(lambda x: x.date[x.date - pd.DateOffset(months = 1)
!= x.date.shift()]).reset_index(level=1,drop=True)
# Ends of periods
en = grp.apply(lambda x: x.date[x.date + pd.DateOffset(months = 1)
!= x.date.shift(-1)]).reset_index(level=1,drop=True)
# Result - concat start / end dates
res = pd.concat([st, en], axis=1).reset_index()
# Set column names
res.columns = ['device', 'start', 'end']
Результат:
device start end
0 1 2016-06-01 2016-08-01
1 1 2017-09-01 2017-10-01
2 2 2016-03-01 2016-04-01
3 2 2016-11-01 2017-01-01