Как мне применить этот код к нескольким CSV?

#python #pandas

#python #pandas

Вопрос:

кто-нибудь может посоветовать мне, как применить этот код к нескольким CSV в одной папке? Затем сохраните измененный csv в другую папку и каждый файл отдельно? Короче говоря, мне нужно это автоматизировать.

Мне нужно автоматически загрузить файл csv, выполнить код, сохранить недавно измененный файл csv, а затем повторить его для следующего файла csv в папке.

 import pandas as pd
import datetime as dt
import numpy as np
from numpy import nan as Nan

path = "C://Users//Zemi4//Desktop//csv//A-001.csv"

df = pd.read_csv(path,delimiter=";")

df['ta'] = pd.to_numeric(df['ta'])
df['tw'] = pd.to_numeric(df['tw'])

df["time_str"] = [dt.datetime.strptime(d, "%d.%m.%Y %H:%M:%S") for d in df["time"]]
df["time_str"] = [d.date() for d in df["time_str"]]
df["time_str"] = pd.to_datetime(df["time_str"])
df["time_zaokrouhleny"]=df["time_str"]

def analyza(pozadovane_data):

    new_list = []

    new_df = pd.DataFrame(new_list)

    new_df=df.loc[df["time_str"] == pozadovane_data,["ta","tw", "zone", "time_zaokrouhleny"]]

    counter = new_df.ta.count()

    if counter < 24:
        for i in range(counter,24):
            new_df.loc[i] = [Nan for n in range(4)]
            new_df["ta"]= new_df.ta.fillna(0)
            new_df["tw"] = new_df.tw.fillna(0)
            new_df["zone"] = new_df.zone.fillna(0)
            new_df["time_zaokrouhleny"]=new_df.time_zaokrouhleny.fillna(new_df.time_zaokrouhleny.min())

    elif counter > 24:
        counter_list = list(range(24,counter))
        new_df = new_df.drop(new_df.index[counter_list])

    new_df["time_oprava"] = [dt.datetime.combine(d.date(),dt.time(1,0)) for d in new_df["time_zaokrouhleny"]]

    s = 0
    cas_list = []

    for d in new_df["time_oprava"]:
        d =d   dt.timedelta(hours=s)
        #print(d)
        #print(s)
        cas_list.append(d)
        s = s   1

    se = pd.Series(cas_list)

    new_df['time_oprava'] = se.values

    new_df['Validace'] = (new_df['ta'] != 0) amp; (new_df['tw'] != 0)

    new_df['Rozdil'] = new_df['ta'] - new_df['tw']

    new_df.rename(columns={"ta": "Skutecna teplota", "tw": "Pozadovana teplota", "time_oprava": "Cas", "zone": "Mistnost"}, inplace = True)

    new_df.index = new_df['Cas']

    return new_df

start = dt.datetime(2010,10,6)
end = dt.datetime(2010,12,27)

date_range = []
date_range = [start   dt.timedelta(days=x) for x in range(0,(end-start).days)]

new_list = []

vysledek_df =pd.DataFrame(new_list)

for d in date_range:
    pom = analyza(d)
    vysledek_df = vysledek_df.append(pom,ignore_index=True)
    vysledek_df.pop('time_zaokrouhleny')
    vysledek_df.to_csv('C://Users//Zemi4//Desktop//zpr//A-001.csv', encoding='utf-8', index=False)
  

Сам код работает корректно. Спасибо за ваш совет.

Ответ №1:

Самый простой способ — использовать glob. Просто укажите folder_path и output_path в соответствии с вашими требованиями и используйте приведенный ниже пример кода. Я прокомментировал код, чтобы помочь вам понять код.

 import os
import glob

folder_path = 'path/to/folder/' # path to folder containing .csv files
output_path = 'path/to/output/folder/' # path to output folder

for file in glob.glob(folder_path   '*.csv'): # only loads .csv files from the folder
    df = pd.read_csv(file, delimiter=";") # read .csv file

    # Do something

    df.to_csv(output_path   'modified_'   str(os.path.basename(file)), encoding='utf-8', index=False) # saves modified .csv file to output_path
  

Ответ №2:

Вы хотите использовать os.listdir() для поиска содержимого каталога, затем параметризовать путь к файлу в новой функции. Затем вы можете перебрать список каталогов, полученных через os.walk() , и запустить функцию для каждого из них.

 import os

def run(file_directory):

    filelist = os.listdir(file_directory)

    for path in filelist:

         df = pd.read_csv(path,delimiter=";")

         # etc.

         df.to_csv(os.path.join(file_directory, 'output.csv'))
  

Если вам нужно создать новый каталог, вы можете использовать os.mkdir(newpath)

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

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

2. Добавлено в конец — просто используйте os.path.join для динамического построения нового пути.

Ответ №3:

Вы все еще можете посоветовать, как параметризовать функцию?

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

1. Что вы имеете в виду?