134 votes

Y a-t-il une fonction pour déterminer dans quel trimestre de l'année se trouve une date?

Bien sûr, je pourrais écrire cela moi-même, mais avant de réinventer la roue, existe-t-il déjà une fonction qui le fait?

1 votes

Si les objets datetime sont stockés dans une série ou un dataframe Pandas, il existe une méthode qui renvoie le(s) trimestre(s) respectif(s) : pandas.Series.dt.quarter.

199voto

Alex Martelli Points 330805

Étant donné une instance x de datetime.date, (x.month-1)//3 vous donnera le trimestre (0 pour le premier trimestre, 1 pour le deuxième trimestre, etc -- ajoutez 1 si vous devez compter à partir de 1 plutôt que de 0;-).


À l'origine, deux réponses, toutes deux très appréciées et même initialement acceptées (toutes deux actuellement supprimées), comportaient des bugs -- ne faisant pas le -1 avant la division, et divisant par 4 au lieu de 3. Puisque .month va de 1 à 12, il est facile de vérifier vous-même quelle formule est correcte :

for m in range(1, 13):
  print m//4 + 1,
print

donne 1 1 1 2 2 2 2 3 3 3 3 4 -- deux trimestres de quatre mois et un seul mois (eep).

for m in range(1, 13):
  print (m-1)//3 + 1,
print

donne 1 1 1 2 2 2 3 3 3 4 4 4 -- cela ne semble-t-il pas nettement préférable à vous?-)

Cela prouve selon moi que la question est bien justifiée;-).

Je ne pense pas que le module datetime devrait nécessairement avoir toutes les fonctions calendaires utiles possibles, mais je sais que je maintiens un module datetools (bien testé;-) pour l'utilisation de mes projets (et ceux des autres) au travail, qui comporte de nombreuses petites fonctions pour effectuer toutes ces calculs calendaires -- certains sont complexes, d'autres simples, mais il n'y a pas de raison de refaire le travail à chaque fois (même le travail simple) ou de risquer des bugs dans de tels calculs;-).

3 votes

Merci Alex. C'est pourquoi il devrait y avoir une fonction. Regardez combien de personnes se sont trompées.

0 votes

Je pense que tu as prouvé ton point. Il est inutile de polluer toute la page avec des commentaires répétés.

1 votes

@Jason, oui, exactement - c'est pourquoi j'ai voté pour votre question une fois que j'ai vu les autres réponses buggy (actuellement supprimées), même si quelqu'un d'autre semble avoir voté contre pour annuler mon vote, ah bien.

68voto

chishaku Points 4042

SI vous utilisez déjà pandas, c'est assez simple.

import datetime as dt
import pandas as pd

quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1

Si vous avez une colonne date dans un dataframe, vous pouvez facilement créer une nouvelle colonne quarter:

df['quarter'] = df['date'].dt.quarter

0 votes

Et si mon trimestre fiscal commence en septembre ?

0 votes

La méthode Pandas pandas.Series.dt.quarter est une solution idéale lorsque vous avez des valeurs de date et d'heure dans un objet Dataframe ou Series.

38voto

Jonathan Rocher Points 51

Je suggérerais une autre solution, plus propre selon certains. Si X est une instance de datetime.datetime.now(), alors le trimestre est :

import math
Q=math.ceil(X.month/3.)

La fonction ceil doit être importée depuis le module math car elle ne peut pas être accédée directement.

1 votes

Le meilleur jusqu'à présent. Merci un million !

3 votes

Probablement devrait envelopper ceci dans un int()

0 votes

Comme le suggère la réponse de @garbanzio. J'ai dû passer l'argument du mois par la fonction de flottation pour que cela fonctionne math.ceil(float(4)/3) = 2.0 tandis que math.ceil(4/3) = 1.0

13voto

Adam Stewart Points 1389

Pour toute personne essayant de déterminer le trimestre de l'année fiscale, qui peut différer de l'année calendrier, j'ai écrit un module Python pour faire exactement cela.

L'installation est simple. Il suffit d'exécuter :

$ pip install fiscalyear

Il n'y a pas de dépendances, et fiscalyear devrait fonctionner pour Python 2 et 3.

C'est essentiellement un wrapper autour du module intégré datetime, donc toutes les commandes datetime que vous connaissez déjà fonctionneront. Voici une démo :

>>> from fiscalyear import *
>>> a = FiscalDate.today()
>>> a
FiscalDate(2017, 5, 6)
>>> a.fiscal_year
2017
>>> a.quarter
3
>>> b = FiscalYear(2017)
>>> b.start
FiscalDateTime(2016, 10, 1, 0, 0)
>>> b.end
FiscalDateTime(2017, 9, 30, 23, 59, 59)
>>> b.q3
FiscalQuarter(2017, 3)
>>> b.q3.start
FiscalDateTime(2017, 4, 1, 0, 0)
>>> b.q3.end
FiscalDateTime(2017, 6, 30, 23, 59, 59)

fiscalyear est hébergé sur GitHub et PyPI. La documentation peut être trouvée sur Read the Docs. Si vous cherchez des fonctionnalités qu'il n'a pas actuellement, faites-le moi savoir !

9voto

JavDomGom Points 41

Ceci est très simple et fonctionne en python3:

from datetime import datetime

# Obtenir la date-heure actuelle.
maintenant = datetime.now()

# Déterminer dans quel trimestre de l'année nous sommes. Renvoie q1, q2, q3 ou q4.
trimestre_de_l_annee = f'q{(maintenant.month-1)//3+1}'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X