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?
Merci Alex. C'est pourquoi il devrait y avoir une fonction. Regardez combien de personnes se sont trompées.
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?
É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;-).
Merci Alex. C'est pourquoi il devrait y avoir une fonction. Regardez combien de personnes se sont trompées.
Je pense que tu as prouvé ton point. Il est inutile de polluer toute la page avec des commentaires répétés.
@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.
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
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
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 !
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.
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
.