Как конвертировать различные форматы времени в «%Y-%m-%d» с помощью Python?

#python #pandas #csv #datetime #strftime

Вопрос:

Я пытаюсь преобразовать любой формат даты «%Y-%m-%d». В моем коде я получаю дату и время ошибки типа.дата не применяется к объекту «str».

 def open_csv2():
    browse_text2.set("Proccessing CSV...")
    csv2file = filedialog.askopenfilename(parent=root, title="Select the CSV", filetypes=[("Text file", "*.csv")])
    
    if csv2file:
        df = pd.read_csv(csv2file, usecols=['date'])
        
        dates = df['date']
        
        new_dates = []
        for i in dates:
            n_date = datetime.strftime(i,"%Y-%m-%d")
            new_dates.append({'date':n_date})
            
        new_dates.to_csv('__newDates.csv', index=False)
                
                
        root.quit()
 

Я получаю эту ошибку:
Ошибка типа: дескриптор «strftime» для объектов «datetime.date» не применяется к объекту «str».

Спасибо!

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

1. Используйте strptime для преобразования строковой даты, которая предположительно является тем, что i есть, в datetime объект, а затем используйте strftime ее для форматирования в виде строки в желаемом формате. Ознакомьтесь с документацией docs.python.org/3.8/library/datetime.html#datetime-objects в нем есть много примеров, которые вы можете использовать.

2. Для диагностики вы можете просто распечатать i — хотя сообщение об ошибке довольно четкое, не так ли.

3. Итак, сообщение об ошибке говорит вам , что у вас есть str объект в том месте, где вы предположительно ожидали получить datetime объект (для выполнения преобразования). Видите ли вы что-нибудь еще в datetime документации по модулю, описывающей, как преобразовать из str в datetime ? (Подсказка: вам нужно будет знать существующий формат.)

4. Похоже, вы верите, что i это а datetime . Но в сообщении об ошибке говорится , что это a string , и это согласуется с вашим намерением преобразовать любой формат даты . Чтобы интерпретировать непредсказуемо отформатированные даты, посмотрите на dateutil.parser .

5. Попробуйте df['date'] = pd.to_datetime(df['date']) преобразовать строки в datetime s

Ответ №1:

Ваш i datetime.strftime(i,"%Y-%m-%d") ввод должен быть в datetime формате, а не в str формате.

Поэтому ваша df['date'] колонка, вероятно, имеет str формат, когда вы импортировали фрейм данных из csv. Пожалуйста, проверьте type количество данных в date столбце.

Если вы хотите преобразовать свое df['date'] значение в строку, вам следует использовать datetime.strptime(i, "%Y-%m-%d") вместо strftime функции.

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

1. Да, это верно. Потому что я пытаюсь конвертировать различные форматы времени. В моем файле CSV я вижу форматы времени «гг/мм/дд», «мм/дд/гг», «мм-дд-гггг». И множество форматов даты и времени. Сначала я попытался преобразовать его в strptime, а затем в strftime. Но я не знаю, что передать в качестве второго параметра для определения всех форматов времени.

2. Попробуйте strptime вместо этого использовать функцию.

Ответ №2:

Попробуйте пример ниже:

 Sample Data


Print(df)
         date
0  28-01-2020
1  15-02-2020
2  15-03-2020
3  25-03-2020
4  01-04-2020
5  30-05-2020
 

См. раздел Тип данных:

Как и вы, это тип данных obj, а не datetime формат.

 print(df.dtypes)
date    object
dtype: object
 

Преобразование даты и времени:

Просто преобразуйте его в datetime , и вы найдете тип данных chnaged.

 df['date'] = pd.to_datetime(df['date'])
print(df)
        date
0 2020-01-28
1 2020-02-15
2 2020-03-15
3 2020-03-25
4 2020-01-04
5 2020-05-30

print(df.dtypes)
date    datetime64[ns]
dtype: object
 

Также посмотрите раздел справки, т. е. help(pd.to_datetime) :

 Examples
--------
Assembling a datetime from multiple columns of a DataFrame. The keys can be
common abbreviations like ['year', 'month', 'day', 'minute', 'second',
'ms', 'us', 'ns']) or plurals of the same

>>> df = pd.DataFrame({'year': [2015, 2016],
...                    'month': [2, 3],
...                    'day': [4, 5]})
>>> pd.to_datetime(df)
0   2015-02-04
1   2016-03-05
dtype: datetime64[ns]