Запретить pandas преобразовывать объекты datetime в временные метки pandas

#python #pandas #datetime

#python #pandas #datetime

Вопрос:

У меня очень простая проблема. Я хочу анализировать строки datetime как объекты python datetime и сохранять их в фрейме данных pandas. Однако я не могу понять, как запретить pandas преобразовывать объект datetime в временную метку pandas. Например:

 import dateutil
import pandas as pd
from io import StringIO

time = '2020-11-03T15:55:21'

no_pandas = dateutil.parser.parse(time)
print (type(no_pandas))

#Create a simple csv
convert = {'Time': lambda x: dateutil.parser.parse(x)}
csv = StringIO(f'Timen{time}')
df = pd.read_csv(csv, parse_dates=False, converters=convert)

print (type(df.iloc[0]['Time']))
 

который печатает:
<класс ‘datetime.datetime’>
<класс ‘pandas._libs.tslibs.timestamps.Временная метка ‘>

Почему pandas переопределяет мои предпочтения для объектов datetime и как я могу предотвратить это?

Комментарии:

1. Почему вы хотите это сделать в первую очередь? Если вам нужна функциональность datetime, например, доступ к атрибутам (например, год, месяц и т.д.), Вы можете использовать pandas datetime . Если нет, просто оставьте datetime в виде строки и преобразуйте при необходимости.

Ответ №1:

После загрузки в pandas add to_pydatetime

 df['Time'] = df['Time'].dt.to_pydatetime()
 

Выход

 type(pd.to_datetime(df['Time']).dt.to_pydatetime()[0])
Out[46]: datetime.datetime
 

Комментарии:

1. Похоже, это не работает, все еще получая временную метку pandas

2. @Will. Evo я отправляю вывод со своего конца

3. Да, для меня это все еще временная метка. Если я запускаю вашу исходную строку кода, я получаю datetime, но если я запускаю первую строку кода, то каждый раз, когда я обращаюсь к времени из фрейма данных, оно по-прежнему остается меткой времени pandas

4. @Уилл. Evo вот почему я упомянул, после загрузки csv в pandas. ~

5. @Will. Эво github.com/pandas-dev/pandas/issues/18305 похоже, это обычная проблема

Ответ №2:

По какой-то причине pandas, похоже, переопределяет тип на pd.Временная метка. Вы должны убедиться, что pandas прочитает столбец как серию dtype=»object». Итак, вы должны сделать что-то вроде:

 df['Time'] = pd.Series(df['Time'].dt.to_pydatetime(), dtype="object")