Чтение файлов Excel на Python с использованием динамических дат в имени файла и листа

#python-3.x #excel #pandas #date

#python-3.x #excel #pandas #Дата

Вопрос:

У меня ситуация, в которой я хотел бы ежедневно читать файл Excel, где имя файла записано в следующем формате: file_name 08.20.2018 xyz.xlsx и обновляется ежедневно, где дата меняется ежедневно.

То же самое, что мне нужно сделать, когда этот файл читается, мне нужно извлечь данные из листа, соглашение об именовании которого также меняется ежедневно в зависимости от даты. Примером названия листа является sheet1-08.20.2020-data

Как я должен этого добиться? Я использую следующий код, но он не работает:

 df = pd.read_Excel(r'file_name 08.20.2018 xyz.xlsx', sheet_name = 'sheet1-08.20.2020-data')
  

как мне обновить эту строку кода, чтобы она ежедневно динамически выбирала данные с поступлением новых дат. И чтобы было понятно, дата также будет инкрементной без пробелов.

Ответ №1:

Вы могли бы использовать pathlib и datetime модуль для автоматизации процесса :

 from pathlib import Path
from datetime import date

#assuming you have a directory of files:
folder = Path(directory of files)
sheetname = f"sheet1-0{date.today().month}.{date.today().day}.{date.today().year}-data"
date_string = f"filename 0{date.today().month}.{date.today().day}.{date.today().year}.xlsx"
xlsx_file = folder.glob(date_string)

#read in data
df = pd.read_excel(io=next(xlsx_file), sheet_name = sheetname)
  

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

1. получение следующей ошибки NameError: имя ‘Pathlib’ не определено. Я заменил путь импорта из pathlib на import pathlib. Я все еще получаю эту ошибку.

2. это нормально, но теперь, если я запускаю его снова, я сталкиваюсь с ошибкой остановки при чтении файла Excel в этой строке df = pd.read_excel(io = next(xlsx_file), sheet_name = sheetname). Я думаю, что знаю причину. Моя дата находится в форме 08.20.2020, тогда как datae_String она считывается как 8.20.2020. Как я должен отформатировать это, чтобы сделать его похожим? а также как я мог бы получить предыдущую дату? например, 19.08.2020?

3. если вы посмотрите на код, которым я поделился, вы увидите, что я поставил 0 перед date.today.month , поэтому он не должен выдавать вам эту ошибку. Вы можете проверить вывод date_string и посмотреть, совпадает ли он. В любом случае вам придется изменить код в соответствии с вашими потребностями. Для предыдущей даты вы могли бы вычесть 1 из даты. Модуль datetime — ваш друг для этого