#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")