У вас есть данные с 5-секундными интервалами в течение нескольких дней.Желаемый конечный формат выглядит следующим образом (с колонкой AM / PM нам нужно добавить, потому что Pandas не может угадать, так как он просматривает одно значение за раз):
31/12/2016 11:59:55 PM
01/01/2017 12:00:00 AM
01/01/2017 12:00:05 AM
01/01/2017 11:59:55 AM
01/01/2017 12:00:00 PM
01/01/2017 12:59:55 PM
01/01/2017 01:00:00 PM
01/01/2017 01:00:05 PM
01/01/2017 11:59:55 PM
02/01/2017 12:00:00 AM
Сначала мы можем проанализироватьВсе это без информации AM / PM, как вы уже показали:
ts = pd.to_datetime(df.TS, format = '%d/%m/%Y %I:%M:%S')
У нас небольшая проблема: 12:00:00 анализируется как полдень, а не полночь.Давайте нормализуем это:
ts[ts.dt.hour == 12] -= pd.Timedelta(12, 'h')
Теперь у нас есть время с 00:00:00 до 11:59:55, дважды в день.
Далее, обратите внимание, что переходы всегда в 00: 00: 00.Мы можем легко определить их, а также первый экземпляр каждой даты:
twelve = ts.dt.time == datetime.time(0,0,0)
newdate = ts.dt.date.diff() > pd.Timedelta(0)
midnight = twelve & newdate
noon = twelve & ~newdate
Затем создайте серию смещений, которую легко проверить на правильность:
offset = pd.Series(np.nan, ts.index, dtype='timedelta64[ns]')
offset[midnight] = pd.Timedelta(0)
offset[noon] = pd.Timedelta(12, 'h')
offset.fillna(method='ffill', inplace=True)
И наконец:
ts += offset