EDITAR: Inclusion d'un tri dans l'affectation de csv_list pour réorganiser les sous-plans dans le bon ordre.
ligne modifiée -> csv_list = sorted(list(base_dir.glob("*.csv")))
J'ai donc simulé vos données (pour ceux qui sont intéressés, le code de la simulation se trouve dans la dernière partie de cette réponse).
Importations nécessaires pour le code
#!/usr/bin/env python3
import calendar
from pathlib import Path
import matplotlib.pyplot as plt
import pandas as pd
Réponse 1 : lire plusieurs fichiers .csv
Il y a la bibliothèque globe terrestre Cependant, je préfère l'implémentation de pathlib intégrée de globe terrestre . Les deux permettent de rechercher un motif regex (comme *.csv), voir la citation ci-dessous de la documentation :
Globaliser le motif relatif donné dans le répertoire représenté par ce fichier chemin, produisant tous les fichiers correspondants (de n'importe quel type)
Le code ci-dessous vous donne une liste de DataFrame pandas. L'argument parse_dates=['time']
convertit automatiquement la colonne time en datetime. Vous n'avez donc pas besoin de pd.to_datetime()
plus. Vous devrez adapter la base en base_dir
pour correspondre au répertoire correct sur votre PC.
# Read in mulitple CSV Files
base_dir = Path("C:/Test/Earthquake-Data")
csv_list = sorted(list(base_dir.glob("*.csv")))
df_list = [pd.read_csv(file, index_col=0,parse_dates=['time']) for file in csv_list]
Réponse 2 : tracer des histogrammes multiples
Vous pouvez créer un sous-plot 2 x 2 avec plt.subplots()
dans le code ci-dessous, j'itère sur la liste des dataframes ainsi que sur la liste des axes avec zip(df_list,fig.get_axes())
et les dépaqueter le tuple résultant de *(df, axes) dans les variables to df
y ax
. Dans la boucle, j'utilise la méthode vectorielle .dt.month
sur la colonne de temps pour créer l'histogramme et changer certains des paramètres d'apparence, c'est-à-dire :
- Titre de l'intrigue secondaire fixé à l'année
title=str(df['time'].dt.year[0])
- Définissez les étiquettes sur les ticks de l'axe des x sur les noms de mois abrégés (stockés dans le fichier
list(calendar.month_abbr[1:])
). Veuillez reconnaître que je import calendar
dans la première partie de ma réponse (ci-dessus).
- Faites pivoter les étiquettes x (mois abrégés) pour améliorer la lisibilité.
Code :
fig, ax = plt.subplots(2,2)
for df, ax in zip(df_list,fig.get_axes()):
df['time'].dt.month.plot(kind="hist",ax=ax,bins=12,title=str(df['time'].dt.year[0]))
ax.set_xticks(range(1,13))
ax.set_xticklabels(list(calendar.month_abbr[1:]))
# Rotate the xticks for increased readability
for tick in ax.get_xticklabels():
tick.set_rotation(45)
fig.tight_layout()
plt.show()
Simulation de données sismiques
#!/usr/bin/env python3
import numpy as np
import pandas as pd
from my_utils.advDateTime import random_datetimes
from pathlib import Path
year_range = range(2016,2020)
time = [random_datetimes(pd.to_datetime(f"1/1/{year}"), pd.to_datetime(f"1/1/{year + 1}"), n=100) \
for year in year_range]
lattitude = [np.random.randint(0,100,100) for i in range(4)]
data = {'Lattitude': lattitude[0],'time':time[0]}
list_dfs = [pd.DataFrame({'Lattitude': data,'time':y}).sort_values("time").reset_index(drop=True) for data,y in zip(lattitude,time)]
# # Export to CSV
base_dir = Path("C:/Test/Earthquake-Data")
[df.to_csv(base_dir/f"I_earthquake{year}.csv") for df,year in zip(list_dfs,year_range)]