to_datetime против to_pydatetime пытается преобразовать str в datetime

#python #pandas #datetime

Вопрос:

У меня есть фрейм данных с одним столбцом, который представляет собой дату и время и является строкой. Формат даты и времени выглядит следующим образом: 4/27/2021 12:39 это то, что я до сих пор пытался преобразовать строку в дату и время:

 new_list = []
for i in range(len(open_times)):
    date = df.iloc[i]['Open Datetime']
    good_date = date.to_datetime()
    # good_date = date.topydatetime()
    new_list.append(good_date)
 

Я использовал to_pydatetime() в прошлом, однако строка была в другом формате.
Когда я запускаю код сверху, я получаю эту ошибку: AttributeError: 'str' object has no attribute 'to_datetime' и я получаю ту же ошибку при запуске закомментированной строки, за исключением to_pydatetime .
Есть какие-нибудь мысли о том, как устранить эту ошибку? Я думаю, что это происходит потому, что формат строки отличается от обычного.

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

1. to_datetime и to_pydatetime ожидайте работы с типом даты и времени pandas, который является 64-разрядным целым числом. Они вообще не работают со строками. В ваших прошлых усилиях панды, должно быть, распознали строковый формат и импортировали их как типы datetime64. Вам придется использовать что-то вроде datetime.datetime.strptime перевода этих строк.

Ответ №1:

Вам нужно использовать datetime.strptime(date_string, format) для преобразования строки в тип datetime

 from datetime import datetime

for i in range(len(open_times)):
    date = df.iloc[i]['Open Datetime']
    good_date = datetime.strptime(date, '%m/%d/%Y %H:%M')
 

Но вы могли бы использовать pd.to_datetime напрямую

 df['Open Datetime'] = pd.to_datetime(df['Open Datetime'])

# Convert a column to list
new_list = df['Open Datetime'].values.tolist()
 

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

1. «Вы должны использовать pd.to_datetime напрямую».:) Это намного эффективнее, чем цикл for

2. О, мне действительно нравятся оба способа! Я не знал, что вы можете просто напрямую преобразовать фрейм данных. Единственная причина, по которой мне больше нравится первое, чем второе, заключается в том, что второе имеет странный формат. Это дает целые числа. Например, он дает 1619527140000000000 в качестве значения одной даты-времени, и я попытался преобразовать его с помощью метки datetime.fromtimestamp(1619527140000000000 / 1e3), но потерпел неудачу

3. @svlad Это не должно давать вам целых чисел. Как насчет df['Open Datetime'] = pd.to_datetime(df['Open Datetime'], format='%m/%d/%Y %H:%M') этого ?

4. Это прекрасно работает! Большое вам спасибо за помощь! Очень признателен вам за это!