Как выбрать определенные файлы csv для указанного диапазона дат из папки в python?

У меня есть папка (находящаяся в том же каталоге, что и скрипт 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'. Функция слияния требует, чтобы полный путь в списке был в этом формате для дальнейшей обработки.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите сделать это с помощью регулярного выражения, вот оно:

# 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']

Спасибо. Это работает в моем коде, чтобы добавить файлы csv, которые я хочу, в список, но я не могу обработать его дальше, когда пытаюсь объединить все файлы из списка в один фрейм данных. Выдает ошибку, что нет такого файла или каталога.

A Newbie 10.11.2022 16:13

могу я спросить, что вы передаете в качестве переменной path функции? Я знаю, что я сделал неправильно, я хотел бы настроить его для ваших нужд. По сути, теперь он возвращает только имя файла, а не полный путь.

Edo Akse 10.11.2022 17:19

если вы пройдете полный путь, он будет работать так, как сейчас, например. мои тестовые файлы находятся в этом каталоге: "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"

Edo Akse 10.11.2022 17:22

Обновление: я интегрировал ваш код с моим без функций. Я нашел то, что мне не хватало - я не добавлял файл вместе с os.path. Ваш ответ помог спасибо!

A Newbie 10.11.2022 20:40

Другие вопросы по теме