Панды `.to_pydatetime ()` не работают внутри DataFrame - PullRequest
0 голосов
/ 28 октября 2019

У меня есть строки типа '03-21-2019', которые я хочу преобразовать в собственный объект даты и времени Python: то есть типа datetime.datetime. Преобразование достаточно просто благодаря pandas:

import pandas as pd
import datetime as dt

date_str = '03-21-2019'
pd_Timestamp = pd.to_datetime(date_str)
py_datetime_object = pd_Timestamp.to_pydatetime()
print(type(py_datetime_object))

с результатом

<class 'datetime.datetime'>

Это именно то, что я хочу, так как я хочу вычислить timedelta, вычитаяодин из них от другого - прекрасно определен в нативном классе Python datetime.datetime. Тем не менее, мои данные в pd.DataFrame. Когда я пытаюсь использовать следующий код:

import pandas as pd
import datetime as dt

df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(lambda x:
                              pd.to_datetime(x).to_pydatetime())
print(type(df['Date'].iloc[0]))

результат будет

<class 'pandas._libs.tslibs.timestamps.Timestamp'>

Это тип НЕПРАВИЛЬНЫЙ , и я могу 't на всю жизнь выясните, почему оценивается только часть выражения lambda (то есть строка-в-pandas-Timestamp), а не последняя часть (то есть pandas-Timestamp-to-datetime. Дата и время). Это не сработает, если я определю функцию явно, вместо использования lambda выражения:

import pandas as pd
import datetime as dt


def to_native_datetime(date_str: str) -> dt.datetime:
    return pd.to_datetime(date_str).to_pydatetime()


df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(to_native_datetime)
print(type(df['Date'].iloc[0]))

Результат такой же, как и раньше. Он определенно выполняет часть функции, так как результат больше не является строкой. Но мне нужен нативный объект Python datetime.datetime, и я не вижу способа его получить. Это похоже на ошибку в pandas, но я, конечно, хочу видеть это как ошибку пользователя с моей стороны.

Почему я не могу получить нативный объект datetime.datetime из строкового столбца pandas.DataFrame?

Я смотрел на этот поток и этот , но ни один из них не отвечает на мой вопрос.

[ПРАВИТЬ]: Вот кое-что еще более странное:

import pandas as pd
import datetime as dt


def to_native_datetime(date_str: str) -> dt.datetime:
    return dt.datetime.strptime(date_str, '%m-%d-%Y')


df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(to_native_datetime)
print(type(df['Date'].iloc[0]))

Здесь я даже неиспользуя pandas для преобразования строки, и я STILL получаю

<class 'pandas._libs.tslibs.timestamps.Timestamp'>

из нее!

Большое спасибо за ваше время!

[ДОПОЛНИТЕЛЬНОЕ РЕДpd.DataFrame. Это не то, что я хотел услышать, но, очевидно, мне придется конвертировать на лету, когда я прочитаю из pd.DataFrame.

...