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.

1voto

seenu s Points 1375
import datetime

def get_quarter_number_and_date_from_choices(p_quarter_choice):
"""
:param p_quarter_choice:
:return:
"""

current_date = datetime.date.today()
# current_quarter = current_date.month - 1 // 3 + 1
if p_quarter_choice == 'Q1':
    quarter = 1
    q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
    q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
    return q_start_date, q_end_date
elif p_quarter_choice == 'Q2':
    quarter = 2
    q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
    q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
    return q_start_date, q_end_date
elif p_quarter_choice == 'Q3':
    quarter = 3
    q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
    q_end_date = datetime.datetime(current_date.year, 3 * quarter + 1, 1) + datetime.timedelta(days=-1)
    return q_start_date, q_end_date
elif p_quarter_choice == 'Q4':
    quarter = 4
    q_start_date = datetime.datetime(current_date.year, 3 * quarter - 2, 1)
    q_end_date = datetime.datetime(current_date.year, 3 * quarter, 1) + datetime.timedelta(days=30)
    return q_start_date, q_end_date
return None

1voto

MikeHoss Points 560

C'est une vieille question mais toujours digne de discussion.

Voici ma solution, en utilisant l'excellent module dateutil.

  from dateutil import rrule,relativedelta

   year = this_date.year
   quarters = rrule.rrule(rrule.MONTHLY,
                      bymonth=(1,4,7,10),
                      bysetpos=-1,
                      dtstart=datetime.datetime(year,1,1),
                      count=8)

   first_day = quarters.before(this_date)
   last_day =  (quarters.after(this_date)
                -relativedelta.relativedelta(days=1)

Ainsi, first_day est le premier jour du trimestre, et last_day est le dernier jour du trimestre (calculé en trouvant le premier jour du trimestre suivant, moins un jour).

0voto

igniteflow Points 1247

Voici une solution verbeuse, mais également lisible qui fonctionnera pour les instances de datetime et date

def get_quarter(date):
    for months, quarter in [
        ([1, 2, 3], 1),
        ([4, 5, 6], 2),
        ([7, 8, 9], 3),
        ([10, 11, 12], 4)
    ]:
        if date.month in months:
            return quarter

0voto

Led Points 334

En utilisant des dictionnaires, vous pouvez le faire en

def get_quarter(month):
    quarter_dictionary = {
        "T1" : [1,2,3],
        "T2" : [4,5,6],
        "T3" : [7,8,9],
        "T4" : [10,11,12]
    }

    for key,values in quarter_dictionary.items():
        for value in values:
            if value == month:
                return key

print(get_quarter(3))

0voto

akash Points 1
pour m in range(1, 13):
  print ((m*3)//10)

0 votes

Merci pour votre réponse et bienvenue sur SO; votre réponse pourrait être correcte, mais pourriez-vous s'il vous plaît donner quelques explications sur pourquoi et comment votre code résoudra le problème.

0 votes

Veuillez ajouter une explication à votre réponse

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