У меня есть строки типа '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
.