Преобразовать неполные 12-часовые строки, похожие на дату и время, в соответствующий тип даты и времени - PullRequest
0 голосов
/ 25 июня 2018

У меня есть серия панд, содержащая строки, похожие на дату и время, в формате 12h, но без сокращений am / pm .Он охватывает весь месяц данных:

40    01/01/2017 11:51:00
41    01/01/2017 11:51:05
42    01/01/2017 11:55:05
43    01/01/2017 11:55:10
44    01/01/2017 11:59:30
45    01/01/2017 11:59:35
46    02/01/2017 12:00:05
47    02/01/2017 12:00:10
48    02/01/2017 12:13:20
49    02/01/2017 12:13:25
50    02/01/2017 12:24:50
51    02/01/2017 12:24:55
52    02/01/2017 12:33:30
Name: TS, dtype: object
(318621,) # shape

Моя цель состоит в том, чтобы преобразовать его в формат даты и времени, чтобы получить соответствующие значения меток времени Unix и провести сравнения / арифметику с другими данными даты и времени, на этот раз24-часовой формат.Итак, я уже попробовал это:

pd.to_datetime(df.TS, format = '%d/%m/%Y %I:%M:%S') # %I for 12h format

Что выводит меня:

64     2017-01-02 00:46:50
65     2017-01-02 00:46:55
66     2017-01-02 01:01:00
67     2017-01-02 01:01:05
68     2017-01-02 01:05:00

Но информация am / pm не принимается во внимание.Я знаю, что, как правило, сначала нужно указать am / pm в строках, затем можно использовать dt.dt.strptime () или pd.to_datetime () разобрать их с помощью индикатора% p.

Итак, я хотел знать, есть ли другой способ решения этой проблемы с помощью datetime или pandas datetime модулей?Или я должен вручную добавить сокращения «am / pm» перед анализом?

1 Ответ

0 голосов
/ 28 июня 2018

У вас есть данные с 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
...