code:
import pandas as pd
import os
from concurrent.futures import ThreadPoolExecutor, as_completed


def load_data(csv_path):
df = pd.read_csv(csv_path, skiprows=1)

return df


def aggregate_to_4h(df):
df.set_index(‘Date’, inplace=True)
# Aggregate according to the specified column names
aggregation = {
‘Open’: ‘first’,
‘High’: ‘max’,
‘Low’: ‘min’,
‘Close’: ‘last’,
‘volume_crypto’: ‘sum’,
‘volume_base’: ‘sum’,
‘tradecount’: ‘sum’
}

df_4h = df.resample(‘4H’).agg(aggregation)
df.sort_index(inplace=True)
df_4h[‘Open’] = df.groupby(pd.Grouper(freq=‘4H’))[‘Open’].first().values
return df_4h


def create_4h(filename, csv_path, out_directory_path):
try:
df = load_data(csv_path)

df_4h = aggregate_to_4h(df)

# Save the aggregated data to a new CSV file
output_path = os.path.join(out_directory_path, f’4h_{filename}‘)
df_4h.to_csv(output_path)
print(f"4h created {output_path}“)
except Exception as e:
print(f"Failed to process {csv_path} due to {e}”)


def process_files(directory, out_directory_path):
with ThreadPoolExecutor() as executor:
futures = []
for filename in os.listdir(directory):
if filename.endswith(’.csv’):
csv_path = os.path.join(directory, filename)
print(f"Processing {filename}…“)
futures.append(executor.submit(create_4h, filename, csv_path, out_directory_path))

for future in as_completed(futures):
pass # Future results or exceptions can be processed here if needed


def main():
# Replace the path with the directory containing your CSV files
directory_path = r”…\downloaded_files\Binance\00_rename_columns_sort\1h_spot"
out_directory_path = r"…\downloaded_files\Binance\00_rename_columns_sort\4h_spot"
process_files(directory_path, out_directory_path)


main()


some example data of my csv files:
Unix Date Symbol Open High Low Close volume_crypto volume_base tradecount
1.60887E+12 12/25/2020 5:00 1INCHBTC 8.51E-06 0.000168 8.51E-06 0.00010947 2207916 256.8839429 17168
1.60888E+12 12/25/2020 6:00 1INCHBTC 0.00010947 0.00011329 9.41E-05 0.00010693 1833765.2 186.9121981 11343
1.60888E+12 12/25/2020 7:00 1INCHBTC 0.00010634 0.00012298 0.00010047 0.00011025 2067113.5 236.2882339 12743
1.60888E+12 12/25/2020 8:00 1INCHBTC 0.00011162 0.0001195 0.00010347 0.00011029 1570496.5 175.0973559 10418
1.60889E+12 12/25/2020 9:00 1INCHBTC 0.00011007 0.000116 0.00010718 0.00011023 862685.8 96.20224944 6533
1.60889E+12 12/25/2020 10:00 1INCHBTC 0.0001103 0.00012444 0.0001103 0.00011533 2052454.4 242.2437374 13444
1.60889E+12 12/25/2020 11:00 1INCHBTC 0.00011533 0.00011999 0.0001024 0.00010768 1410575.3 157.3953309 9802
1.6089E+12 12/25/2020 12:00 1INCHBTC 0.00010774 0.0001131 9.71E-05 9.89E-05 1265864.7 134.7208468 10978


error:
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_ALPHABUSD_1h.csv due to “None of [‘Date’] are in the columns”
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_ALPHABNB_1h.csv due to “None of [‘Date’] are in the columns”
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_ALPHAUSDT_1h.csv due to “None of [‘Date’] are in the columns”
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_AMBBNB_1h.csv due to “None of [‘Date’] are in the columns”
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_AMBETH_1h.csv due to “None of [‘Date’] are in the columns”
Failed to process …\downloaded_files\Binance\00_rename_columns_sort\1h_spot\Binance_ANKRUSDT_1h.csv due to “None of [‘Date’] are in the columns”