#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
. Но в сообщении об ошибке говорится , что это astring
, и это согласуется с вашим намерением преобразовать любой формат даты . Чтобы интерпретировать непредсказуемо отформатированные даты, посмотрите на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]