У меня есть папка (находящаяся в том же каталоге, что и скрипт python) с большим количеством CSV-файлов, начиная с 1 января по 31 декабря, и я хочу читать только определенные CSV-файлы в пределах определенного диапазона дат из папки в python, а затем добавляя файлы в список.
Файлы названы, как показано ниже, и есть файлы для каждого дня нескольких месяцев:
BANK_NIFTY_5MINs_2020-02-01.csv, BANK_NIFTY_5MINs_2020-02-02.csv, ... BANK_NIFTY_5MINs_2020-02-28.csv, BANK_NIFTY_5MINs_2020-03-01, .... BANK_NIFTY_5MINs_2020-03-03-и т. д.
В настоящее время у меня есть код для получения CSV-файлов за весь март с использованием синтаксиса «startswith» и «endswith». Однако это позволяет мне нацеливать файлы только на один месяц за раз. Я хочу иметь возможность читать CSV-файлы за несколько месяцев в указанном диапазоне дат, например, в октябре, ноябре и декабре или феврале и марте (в основном начало и конец в любом месяце).
Следующий код получает файлы только за март. Затем я извлекаю файлы из списка и объединяю их в фрейм данных.
#Accessing csv files from directory
startdate = datetime.strptime("2022-05-01", "%Y-%m-%d")
enddate = datetime.strptime("2022-06-30", "%Y-%m-%d")
all_files = []
path = os.path.realpath(os.path.join(os.getcwd(),os.path.dirname('__file__')))
for root, dirs, files in os.walk(path):
for file in files:
if file.startswith("/BANK_NIFTY_5MINs_") and file.endswith(".csv"):
file_date = datetime.strptime(os.path.basename(file), "BANK_NIFTY_5MINs_%Y-%m-%d.csv")
if startdate <= file_date <= enddate:
all_files.append(os.path.join(root, file))
Вывод выше выглядит: «BANK_NIFTY_5MINs_2020-03-01.csv» и т. д. но должен быть весь путь, например: 'c:\Users\User123\Desktop\Myfolder\2020\BANK\BANK_NIFTY_5MINs_2020-03-01.csv'. Функция слияния требует, чтобы полный путь в списке был в этом формате для дальнейшей обработки.
Если вы хотите сделать это с помощью регулярного выражения, вот оно:
# replace `file.startswith(...) and file.endswith(...)`
re.match('BANK_NIFTY_5MINs_2020-(02|03|10|11|12)-[0-9]+', file)
### ^^^^^^^^^^^^^^ Feb, Mar, Oct-Dec
Это самый простой способ, который поможет вам начать работу, его можно улучшить.
Но в вашем случае я бы выбрал простой glob:
all_files = glob.glob('./BANK_NIFTY_5MINs_2020-0[2-3]-*.csv')
Я бы выбрал другой подход для большей гибкости
import os
from datetime import datetime
from pprint import pprint
def quick_str_to_date(s: str) -> datetime:
return datetime.strptime(s, "%Y-%m-%d")
def get_file_by_date_range(path: str, startdate: datetime or str, enddate: datetime or str) -> list:
if type(startdate) == str:
startdate = quick_str_to_date(startdate)
if type(enddate) == str:
enddate = quick_str_to_date(enddate)
result = []
for root, dirs, files in os.walk(path):
for filename in files:
if filename.startswith("BANK_NIFTY_5MINs_") and filename.lower().endswith(".csv"):
file_date = datetime.strptime(os.path.basename(filename), "BANK_NIFTY_5MINs_%Y-%m-%d.csv")
if startdate <= file_date <= enddate:
result.append(filename)
return result
print("all")
pprint(get_file_by_date_range("/full/path/to/files", "2000-01-01", "2100-12-31"))
print("\nfebuari")
pprint(get_file_by_date_range("/full/path/to/files", "2020-02-01", "2020-02-28"))
print("\none day")
pprint(get_file_by_date_range("/full/path/to/files", "2020-02-01", "2020-02-01"))
вывод
all
['/full/path/to/files/BANK_NIFTY_5MINs_2020-02-02.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-02-28.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-03-01.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-03-31.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-02-01.csv']
febuari
['/full/path/to/files/BANK_NIFTY_5MINs_2020-02-02.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-02-28.csv',
'/full/path/to/files/BANK_NIFTY_5MINs_2020-02-01.csv']
one day
['/full/path/to/files/BANK_NIFTY_5MINs_2020-02-01.csv']
могу я спросить, что вы передаете в качестве переменной path
функции? Я знаю, что я сделал неправильно, я хотел бы настроить его для ваших нужд. По сути, теперь он возвращает только имя файла, а не полный путь.
если вы пройдете полный путь, он будет работать так, как сейчас, например. мои тестовые файлы находятся в этом каталоге: "C:\workspaces\vs_code\stackoverflow\74386583\csv
, поэтому мне нужно установить переменную path
в "C:\\workspaces\\vs_code\\stackoverflow\\74386583\\csv"
(избегая косых черт, потому что Windows. В моем Linux WSL путь будет /mnt/c/workspaces/vs_code/stackoverflow/74386583
, поэтому я передаю это как строку "/mnt/c/workspaces/vs_code/stackoverflow/74386583"
Обновление: я интегрировал ваш код с моим без функций. Я нашел то, что мне не хватало - я не добавлял файл вместе с os.path. Ваш ответ помог спасибо!
Спасибо. Это работает в моем коде, чтобы добавить файлы csv, которые я хочу, в список, но я не могу обработать его дальше, когда пытаюсь объединить все файлы из списка в один фрейм данных. Выдает ошибку, что нет такого файла или каталога.