Ошибка атрибута: объект ‘str’ не имеет атрибута ‘strftime’ в python

#python

Вопрос:

Мне нужно запустить скрипт, в котором я должен изменить дату дня в нескольких полях кода, но у меня возникли проблемы с получением скриптом только даты дня, он получает дату только вручную в этом формате:

 import datetime as date  

Data_inicio = dt.date(2020,3, 1) #Ano, mês, Dia #here
Data_Fim =    dt.date(2021,10,29)
 

Я попытался изменить код таким образом:

 import datetime as date  

data = date.datetime.now()
data_today = data.strftime("%Y,%m,%d")
Data_inicio = dt.date(2020,3, 1) 
Data_Fim = dt.date(data_today) 
 

или

 Data_Fim = data_today 
 

Следующая ошибка возникает в data_fim :

 files=glob.glob(url '/*' Data_inicio.strftime("%d%b%Y") '-' Data_Fim.strftime("%d%b%Y") '.txt')
files_inativos =glob.glob(url_inativos '/*'  '.txt')
files = files   files_inativos


AttributeError: 'str' object has no attribute 'strftime'
 

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

1. вы должны были сделать, как import datatime as datetime вместо import datatime as date

2. Так ли это на самом деле datatime ? Я думаю, что это должно быть datetime

3. strftime используется для форматирования объектов datetime, поэтому он переводит вас из datetime str в. While strptime используется для разбора строк в объекты datetime, поэтому он ведет вас противоположным путем. В вашем случае вы пытаетесь создать date из строки в Data_Fim , но строка не может быть отформатирована в datetime, ее можно только проанализировать. Для создания из строки используйте strptime

4. Пожалуйста, исправьте свои операторы импорта, чтобы использовать правильные модули

Ответ №1:

Кажется, единственное, что вы хотите, это установить переменную «дата окончания» в качестве вашей data_today , но как datetime объект, а не строку. Проблема в том, что вы пытаетесь сделать это непосредственно из строки, но в строках нет методов для преобразования даты и времени. Чтобы использовать их, вы можете использовать datetime.strptime() , например:

 from datetime import datetime 

date_today = datetime.today().strftime("%Y, %m, %d")
start_date = datetime(2020, 3, 1)
end_date = datetime.strptime(date_today, "%Y, %m, %d")
 

Это создает строку для «сегодня» (с именем date_today ), создает datetime объект для начальной даты (с именем start_date ), затем создает переменную конечной даты ( end_date ), которая фактически анализируется из существующей строки. В частности, в этом случае эта строка — та, которую мы только что создали ( date_today ) .

Обратите внимание, что этот пример имеет в основном обучающие цели, поскольку нет смысла создавать строку «today» из datetime , а затем анализировать ее обратно в datetime объект. Синтаксический анализ имел end_date бы гораздо больше смысла, если бы вы получали его date_today из другого места, но с известным форматом, и в этом случае вы можете преобразовать его в datetime объект и использовать его. Однако на самом деле вам не нужно использовать строковое представление «сегодня» в том же контексте.

Если это тот случай, когда вы определяете их в одном контексте, то, вероятно, вам вообще не нужны 2 переменные, и вы можете использовать только datetime объект. Всякий раз, когда вам нужно распечатать его или отобразить в виде строки, вы можете отформатировать его для этого конкретного вывода. Например:

 from datetime import datetime 

start_date = datetime(2020, 3, 1)
end_date = datetime.today()

print(end_date.strftime("%Y, %m, %d"))
>>> 2021, 10, 29
 

Обратите внимание, что если вы обрабатываете даты и время, обычно лучше просто использовать datetime объекты и форматировать их всякий раз, когда требуется выходная строка. Экономит много работы и туда и обратно форматирование-разбор-форматирование-разбор материала. Кроме того, это позволяет вам использовать временные интервалы.

Ответ №2:

Похоже, что вы создаете datetime объект, а затем пытаетесь извлечь часть этого объекта (только date часть). Вы можете решить эту проблему, создав экземпляр date datetime объекта or и извлекая нужные атрибуты:

 import datetime

# Using date objects
start_date = datetime.date(year=2020, month=3, day=1)
end_date = datetime.date.today()

# Using datetime objects (will include hours, minutes, seconds...)
start_date = datetime.datetime(year=2020, month=3, day=1)
end_date = datetime.datetime.today()

# You can format either object with the `.strftime()` method
date_now = datetime.date.today()
datetime_now = datetime.date.today()

for dt in [date_now, datetime_now]:
    # format and print
    print(dt.strftime('%Y,%m,%d'))
    
    # Or access the attributes directly
    print([dt.year, dt.month, dt.day])
 

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

1. спасибо, я ломал голову над решением.