2009-09-10 38 views
60

Claro que podría escribir esto yo mismo, pero antes de ir a reinventar la rueda ¿hay alguna función que ya lo haga?¿Hay una función de Python para determinar en qué trimestre del año se encuentra una fecha?

+13

pregunta muy justificada a pesar de que las primeras respuestas parecen un poco despectivo ("sólo una cuestión de", "parece bastante simple "): dos de las respuestas (¡incluida una UPVITED!) son horriblemente caóticas, mostrando que NO es tan simple o" simplemente "... –

+0

Estoy seguro de que volverá y solucionará esto –

Respuesta

105

Dada una instancia x de datetime.date, (x.month-1)//3 le dará el trimestre (0 para el primer trimestre, 1 para el segundo trimestre, etc., agregue 1 si necesita contar desde 1 en su lugar ;-).


Originalmente dos respuestas, se multiplican upvoted e incluso aceptados originalmente (ambos actualmente eliminada), fueron con errores - no hacer el -1 antes de la división, y dividiendo por 4 en lugar de 3. Desde .month va del 1 al 12, es fácil comprobar por sí mismo qué fórmula es correcta:

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

da 1 1 1 2 2 2 2 3 3 3 3 4 - dos trimestres de cuatro meses y un mes uno (EEP).

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

da 1 1 1 2 2 2 3 3 3 4 4 4 - ahora no esta mirada mucho más preferible a usted -?)

Esto demuestra que la cuestión es bien justificado, creo ;-).

No creo que el módulo de fecha y hora necesariamente tenga todas las funciones calendáricas útiles, pero sé que tengo un (bien probado ;-) módulo datetools para el uso de mis (y otros) proyectos en el trabajo , que tiene muchas funciones pequeñas para realizar todos estos cálculos calendáricos: algunos son complejos, otros simples, pero no hay razón para hacer el trabajo una y otra vez (incluso un trabajo simple) o cometer errores de riesgo en tales cálculos ;-).

+1

Gracias Alex. Es por eso que debería haber una función. Mira cuántas personas lo entendieron mal. –

+0

Creo que probó su punto. No es necesario contaminar toda la página con comentarios repetidos. –

+1

@ Jason, sí, exactamente. Es por eso que voté por encima de tu pregunta una vez que vi las otras respuestas erróneas (actualmente eliminadas), a pesar de que alguien parece haber votado negativamente para contar mi voto positivo, ah bueno. –

0

hmmm modo que los cálculos pueden ir mal, aquí es una versión mejor (sólo para el bien de ella)

first, second, third, fourth=1,2,3,4# you can make strings if you wish :) 

quarterMap = {} 
quarterMap.update(dict(zip((1,2,3),(first,)*3))) 
quarterMap.update(dict(zip((4,5,6),(second,)*3))) 
quarterMap.update(dict(zip((7,8,9),(third,)*3))) 
quarterMap.update(dict(zip((10,11,12),(fourth,)*3))) 

print quarterMap[6] 
+2

los cálculos solo pueden salir mal si el cálculo es incorrecto. –

+0

@RussBradberry en este caso puede estar en lo cierto, pero a veces la legibilidad y ser explícita cuenta y conduce a menos errores, en lugar de un cálculo breve –

+1

@RussBradberry también ver respuestas eliminadas y comentarios sobre eso, ver un simple cálculo puede ser complicado para siempre programadores también y es difícil ver la corrección excepto al probarlo, en mi solución puede ver y asegurarse de que funcionará –

16

Yo sugeriría otra solución podría decirse más limpio. Si X es una instancia datetime.datetime.now(), entonces el trimestre es:

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

ceil tiene que ser importados de módulo matemático, ya que no se puede acceder directamente.

+1

El mejor hasta el momento. ¡Gracias una tonelada! – curlyreggie

+3

Probablemente debería envolver esto en un int() – Pablojim

+0

Como lo sugiere la respuesta de @garbanzio. Necesitaba poner el argumento del mes a través de la función float para hacer que esto funcione '' 'math.ceil (float (4)/3) = 2.0''' mientras' '' math.ceil (4/3) = 1.0' ' –

1

Esta es una pregunta antigua, pero aún digna de discusión.

Aquí está mi solución, utilizando el excelente módulo 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) 

Así first_day es el primer día del trimestre, y last_day es el último día del trimestre (calculada al encontrar el primer día del próximo trimestre, menos de un día).

1

si m es el número del mes ...

import math 
math.ceil(float(m)/3) 
17

SI ya está utilizando pandas, es bastante simple.

import datetime as dt 
import pandas as pd 

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

Si usted tiene una columna date en una trama de datos, puede crear fácilmente una nueva quarter columna:

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

Para cualquiera que trate de obtener la cuarta parte de la fiscal años, que puede diferir desde el calendario año, escribí un módulo de Python para hacer esto.

La instalación es simple. Sólo tiene que ejecutar:

$ pip install fiscalyear 

No hay dependencias, y fiscalyear debería funcionar tanto para Python 2 y 3.

Se trata básicamente de una envoltura alrededor de la incorporada en el datetime módulo, por lo que cualquier datetime comandos que ya está familiarizado con funcionará. He aquí una demostración:

>>> 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á alojado en GitHub y PyPI. La documentación se puede encontrar en Read the Docs. Si está buscando funciones que actualmente no tiene, ¡hágamelo saber!

0

Aquí es una solución prolija, pero también puede leer que funcione para casos de fecha y hora y fecha

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 
Cuestiones relacionadas