Проблемы с получением двух столбцов в формате datetime.datetime - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть код, написанный на данный момент для изменения двух столбцов моего информационного кадра из строк в объекты datetime.datetime, подобные следующим:

def converter(date):
    date = dt.strptime(date, '%m/%d/%Y %H:%M:%S')
    return date

df = pd.DataFrame({'A':['12/31/9999 0:00:00','1/1/2018 0:00:00'],
                   'B':['4/1/2015 0:00:00','11/1/2014 0:00:00']})

df['A'] = df['A'].apply(converter)
df['B'] = df['B'].apply(converter)

Когда я запускаю этот код и печатаю информационный кадр, он приходитвот так

                     A          B
0  9999-12-31 00:00:00 2015-04-01
1  2018-01-01 00:00:00 2014-11-01

Когда я проверял типы данных каждого столбца, они читают

A            object
B    datetime64[ns]

Но когда я проверяю формат фактических ячеек первой строки, они читают

<class 'datetime.datetime'>
<class 'pandas._libs.tslib.Timestamp'>

После экспериментов, я думаю, что я столкнулся с ошибкой за пределами границ из-за даты '12 / 31/9999 0:00:00 'в столбце' A ', и это вызываетэтот столбец будет приведен как объект datetime.datetime.У меня вопрос, как я могу также преобразовать столбец «B» моего фрейма данных в объект datetime.datetime, чтобы я мог выполнить запрос по столбцам, аналогичным

df.query('A > B')

, не получая ошибку или неправильный вывод.

Заранее спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Поскольку '9999' - это всего лишь фиктивный год, вы можете упростить свою жизнь, выбрав фиктивный год, который находится в границах (или тот, который имеет больше смысла, учитывая ваши фактические данные):

import pandas as pd

df.replace('9999', '2060', regex=True).apply(pd.to_datetime)

Вывод:

           A          B
0 2060-12-31 2015-04-01
1 2018-01-01 2014-11-01

A    datetime64[ns]
B    datetime64[ns]
dtype: object

Как указывает @coldspeed, возможно, лучше удалить эти плохие даты:

df.apply(pd.to_datetime, errors='coerce')
#           A          B
#0        NaT 2015-04-01
#1 2018-01-01 2014-11-01
...