Natürlich könnte ich das selbst schreiben, aber bevor ich das Rad neu erfinde, gibt es eine Funktion, die dies bereits tut?
Natürlich könnte ich das selbst schreiben, aber bevor ich das Rad neu erfinde, gibt es eine Funktion, die dies bereits tut?
Antworten:
Wenn Sie eine Instanz x
von datetime.date angeben , erhalten (x.month-1)//3
Sie das Quartal (0 für das erste Quartal, 1 für das zweite Quartal usw. - addieren Sie 1, wenn Sie stattdessen von 1 zählen müssen ;-).
Ursprünglich waren zwei Antworten, mehrfach positiv bewertet und sogar ursprünglich akzeptiert (beide derzeit gelöscht), fehlerhaft - nicht -1
vor der Teilung und durch 4 statt 3 geteilt. Da es .month
sich um 1 bis 12 handelt, ist es einfach, selbst zu überprüfen, welche Formel vorliegt richtig:
for m in range(1, 13):
print m//4 + 1,
print
gibt 1 1 1 2 2 2 2 3 3 3 3 4
- zwei viermonatige Quartale und ein einmonatiges (eep).
for m in range(1, 13):
print (m-1)//3 + 1,
print
gibt 1 1 1 2 2 2 3 3 3 4 4 4
- sieht dir das jetzt nicht vorzuziehen aus? -)
Dies beweist, dass die Frage gut begründet ist, denke ich ;-).
Ich denke nicht, dass das datetime-Modul unbedingt alle möglichen nützlichen Kalenderfunktionen haben sollte, aber ich weiß, dass ich ein (gut getestetes ;-) datetools
Modul für die Verwendung meiner (und anderer) Projekte bei der Arbeit habe, das viele wenig hat Funktionen zum Ausführen all dieser Kalenderberechnungen - einige sind komplex, andere einfach, aber es gibt keinen Grund, die Arbeit immer wieder zu erledigen (auch einfache Arbeit) oder Fehler in solchen Berechnungen zu riskieren ;-).
(m+2)//3
anstelle von(m-1)//3 + 1
Wenn Sie bereits verwenden pandas
, ist es ganz einfach.
import datetime as dt
import pandas as pd
quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1
Wenn Sie eine date
Spalte in einem Datenrahmen haben, können Sie einfach eine neue quarter
Spalte erstellen :
df['quarter'] = df['date'].dt.quarter
Ich würde eine andere wohl sauberere Lösung vorschlagen. Wenn X eine datetime.datetime.now()
Instanz ist, lautet das Quartal:
import math
Q=math.ceil(X.month/3.)
Ceil muss aus dem Mathematikmodul importiert werden, da nicht direkt darauf zugegriffen werden kann.
math.ceil(float(4)/3) = 2.0
math.ceil(4/3) = 1.0
.
nach den 3 taten. math.ceil(4/3.) = 2.0
Für alle, die versuchen, das Quartal des Geschäftsjahres zu ermitteln , das vom Kalenderjahr abweichen kann , habe ich ein Python-Modul geschrieben, um genau dies zu tun.
Die Installation ist einfach. Renn einfach:
$ pip install fiscalyear
Es gibt keine Abhängigkeiten und fiscalyear
sollte sowohl für Python 2 als auch für Python 3 funktionieren.
Es handelt sich im Grunde genommen um einen Wrapper um das integrierte datetime- Modul, sodass alle datetime
Befehle, mit denen Sie bereits vertraut sind, funktionieren. Hier ist eine Demo:
>>> 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
wird auf GitHub und PyPI gehostet . Die Dokumentation finden Sie unter Lesen Sie die Dokumente . Wenn Sie nach Funktionen suchen, die derzeit nicht verfügbar sind, lassen Sie es mich wissen!
Hier ist ein Beispiel für eine Funktion, die ein datetime.datetime-Objekt abruft und für jedes Quartal eine eindeutige Zeichenfolge zurückgibt:
from datetime import datetime, timedelta
def get_quarter(d):
return "Q%d_%d" % (math.ceil(d.month/3), d.year)
d = datetime.now()
print(d.strftime("%Y-%m-%d"), get_q(d))
d2 = d - timedelta(90)
print(d2.strftime("%Y-%m-%d"), get_q(d2))
d3 = d - timedelta(180 + 365)
print(d3.strftime("%Y-%m-%d"), get_q(d3))
Und die Ausgabe ist:
2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017
wenn m
ist die Monatszahl ...
import math
math.ceil(float(m) / 3)
Diese Methode funktioniert für jede Zuordnung:
month2quarter = {
1:1,2:1,3:1,
4:2,5:2,6:2,
7:3,8:3,9:3,
10:4,11:4,12:4,
}.get
Wir haben gerade eine Funktion generiert int->int
month2quarter(9) # returns 3
Diese Methode ist auch narrensicher
month2quarter(-1) # returns None
month2quarter('July') # returns None
Für diejenigen, die mit Pandas nach Geschäftsquartalsdaten suchen,
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
Referenz: Pandas Period Index
Dies ist eine alte Frage, die aber noch diskutiert werden sollte.
Hier ist meine Lösung mit dem hervorragenden Dateutil- Modul.
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)
Dies first_day
gilt auch für den ersten Tag des Quartals und last_day
den letzten Tag des Quartals (berechnet anhand des ersten Tages des nächsten Quartals abzüglich eines Tages).
hmmm damit Berechnungen schief gehen können, hier ist eine bessere Version (nur deswegen)
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]
"it is difficult to see correctness except by testing it"
. Sie sollten Tests schreiben, wie es alle guten Entwickler tun sollten. Tests helfen Ihnen, Fehler zu vermeiden und diejenigen zu erfassen, die Sie tun. Ein Entwickler sollte niemals auf Leistung und Lesbarkeit verzichten, um Fehler zu vermeiden. Dies ist auch weniger lesbar, als wenn Sie nur ein statisches Diktat mit Literalen erstellen würden.
(m-1)//3 + 1
ist auch nicht so lesbar, nicht viele Leute wissen, was //
tut. Mein ursprünglicher Kommentar war nur auf die Aussage, "calculations can go wrong"
die für mich nur seltsam klingt.