extraire le mois et l'année avec pandas

Pandas

a marqué ce sujet comme résolu.

Bonjour ! Je besoin d’aide sur mon code python.

Voici mon code :

df = pd.read_sql_query("SELECT nature, montant, date FROM depense", conn)

J’utilise ma base de donnée de MySQL via la librairie Pandas. J’ai souhaite afficher les résultats concernant la nature de dépense ainsi que le montant de la dépense uniquement pour le mois et l’année que je souhaite avoir.

Donc en gros extraire les données du mois et de l’année (ex : les résultats pour le mois de septembre 2021).

Merci pour votre aide !

Salut ! Je pense que c’est difficile de donner une réponse précise sans connaitre exactement la structure de tes tables de données. Mais ne peux-tu pas simplement appliquer le filtre sur la date dans ta requête SQL ? Donc quelque chose comme SELECT nature, montant, date FROM depense WHERE date BETWEEN '2021-09-01' AND '2021-09-30'?

Voici la structure de ma table dépense

req = """ CREATE TABLE depense(ID_depense INT AUTO_INCREMENT PRIMARY KEY NOT NULL, nature VARCHAR(35) NOT NULL, montant DOUBLE NOT NULL, commentaire TEXT(155) NULL, date DATE NOT NULL ) """

Il existe la fonction extract sur SQL, qui permet d’extraire sois le mois, l’année ou l’année et le mois ensemble.

N’existe t-il pas une telle fonction sous la librairie Pandas. J’utilise Pandas car hormis l’analyse que je dois faire sur les données, je dois aussi les afficher sous seaborn ou maplotlib.

Voici la structure de ma table dépense

req = """
                CREATE TABLE depense(ID_depense INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
                nature VARCHAR(35) NOT NULL,
                montant DOUBLE NOT NULL,
                commentaire TEXT(155) NULL,
                date DATE NOT NULL
                )
                """

Il existe la fonction extract sur SQL, qui permet d’extraire sois le mois, l’année ou l’année et le mois ensemble.

Étant donnée la structure de ta table, la proposition de @Migwel se tient, tu peux mettre quelque chose comme ça dans ton appel SQL depuis Python :

SELECT
  nature, montant, date
FROM
  depense
WHERE
  date BETWEEN :start AND :end

Les valeurs de :start et :end pourront être fixées de façon à correspondre au mois de l’année que tu souhaites.

Il existe la fonction extract sur SQL, qui permet d’extraire sois le mois, l’année ou l’année et le mois ensemble.

Comme tu le dis si bien, MySQL propose aussi des fonctions pour sélectionner des dates qui correspondent à un mois précis et une année précise, mais je ne pas sûr que la conjonction des deux clauses permette d’utiliser l’index (s’il y a index). Tu peux tester, mais je ne garantis pas les performances :

SELECT
  nature, montant, date
FROM
  depense
WHERE
  YEAR(date) = :year AND  -- ou EXTRACT(YEAR...)
  MONTH(date) = :month    -- ou EXTRACT(MONTH...)

N’existe t-il pas une telle fonction sous la librairie Pandas. J’utilise Pandas car hormis l’analyse que je dois faire sur les données, je dois aussi les afficher sous seaborn ou maplotlib.

Ça ne serait pas le bon plan, je pense. La base de données peut te sortir les données filtrées à traiter avec Pandas de façon efficace (si date est indexé). Pandas, lui, devra pour chaque ligne déterminer s’il faut la traiter ou non (si la ligne correspond au mois et à l’année que tu souhaites).

Je pense que le mieux est donc de filtrer en amont au niveau SQL, puis de laisser Pandas faire le reste du traitement, ça sera sûrement bien plus performant.

Autre remarque importante. Tu utilises le type DOUBLE pour exprimer les montants dans ta table. Ce type est à virgule flottant et donc par nature approximatif. Il est sujet a des erreurs de précision qui peuvent le rendre particulièrement inadapté pour exprimer des montants financiers. (La documentation de MySQL contient une mise en garde ici).

Le type à utiliser serait plutôt DECIMAL :

The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve exact precision, for example with monetary data.

https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte