Как объединить дату и время в разных форматах Pandas с одной временной меткой? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть два столбца в фрейме данных pandas, как показано ниже.Обратите внимание, что некоторые из EVENT_TIME в hh.mm.ss, некоторые в hh:mm:ss AM/PM формате.

enter image description here

При запуске ...

import pandas

df['EVENT_DATE'] = pd.to_datetime(df['EVENT_DATE'], format='%Y%m%d')

print(df['EVENT_DATE'])

... Я могу получить EVENT_DATEв формате расходных материалов (для моих целей) (например, 1999-07-28).

Но при запуске ...

df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')

print(df['EVENT_TIME'])

... 1900-01-01 добавляется к временам и применяется не ко всем строкам.

1900-01-01 16:40:00
1900-01-01 15:55:00
1900-01-01 14:30:00
1900-01-01 13:26:00
NaT
NaT
NaT
NaT

Как объединить дату и время (включая несколько форматов времени) в одной отметке времени?

Редактировать1:

@ Решение Вэнь-Бена привело меня сюда:

1      19:53:00
11     14:30:00
15     16:30:00

Затем, чтобы объединить EVENT_DATE и EVENT_TIME, я нашел это (что работает):

df['TIMESTAMP'] = df.apply(lambda r : pd.datetime.combine(r['EVENT_DATE'], r['EVENT_TIME']),1)

... приводит к:

1     1999-07-28 19:53:00
11    2001-07-28 14:30:00
15    2002-06-07 16:30:00

Далее я хочу получить это в формате ISO8601.Итак, я нашел это (который работает):

pd.to_datetime(df['TIMESTAMP']).apply(lambda x: x.strftime('%Y%m%dT%H:%M%SZ'))

... приводит к:

1      19990728T19:5300Z
11     20010728T14:3000Z
15     20020607T16:3000Z

ЗДЕСЬ МОЯ НОВАЯ ПРОБЛЕМА:

Запуск print(TIMESTAMP) по-прежнему показывает объединенные версии (например, 1999-07-28 19:53:00) вместо версии ISO (например, 19990728T19:5300Z)

Как получить ISO8601столбец «добавлен» к фрейму данных?

В идеале я хочу, чтобы он занял место TIMESTAMP.Я хочу это как преобразование данных, а не как новый столбец.

1 Ответ

3 голосов
/ 26 апреля 2019

Использование fillna

s1=pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
s2=pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')
df['EVENT_TIME']=s1.fillna(s2)
...