Конечно, я мог бы написать это сам, но прежде чем я заново изобретаю колесо, есть функция, которая уже делает это?
Есть ли функция Python для определения того, в каком квартале года находится дата?
Ответ 1
Учитывая экземпляр x
datetime.date, (x.month-1)//3
предоставит вам квартал (0 для первого квартала, 1 для второго квартал и т.д. - добавьте 1, если вам нужно подсчитать от 1 вместо; -).
Изначально два ответа, умноженные на приоритет и даже первоначально принятые (оба в настоящее время удалены), были ошибочными - не выполняли -1
перед делением и делятся на 4 вместо 3. Так как .month
идет от 1 до 12, легко проверить, какая формула правильная:
for m in range(1, 13):
print m//4 + 1,
print
дает 1 1 1 2 2 2 2 3 3 3 3 4
- два четырехмесячных квартала и одномесячный (eep).
for m in range(1, 13):
print (m-1)//3 + 1,
print
дает 1 1 1 2 2 2 3 3 3 4 4 4
- теперь вам это не кажется более предпочтительным? -)
Это доказывает, что вопрос вполне обоснован, я думаю; -).
Я не думаю, что модуль datetime должен обязательно иметь любую возможную полезную функцию, но я знаю, что поддерживаю (хорошо проверенный;-) datetools
модуль для использования моих (и других) проектов в работа, которая имеет множество небольших функций для выполнения всех этих калибровочных вычислений - некоторые из них сложны, некоторые просты, но нет причин для повторной работы (даже простой работы) или ошибок в таких вычислениях; -).
Ответ 2
IF, вы уже используете pandas
, это довольно просто.
import datetime as dt
import pandas as pd
quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1
Если в кадре данных есть столбец date
, вы можете легко создать новый столбец quarter
:
df['quarter'] = df['date'].dt.quarter
Ответ 3
Я бы предложил другое, более чистое решение. Если X является экземпляром datetime.datetime.now()
, то четверть:
import math
Q=math.ceil(X.month/3.)
ceil должен быть импортирован из математического модуля, поскольку он не может быть доступен напрямую.
Ответ 4
Для тех, кто пытается получить четверть финансового года, который может отличаться от календарного года, я написал модуль Python для этого.
Установка проста. Просто беги:
$ pip install fiscalyear
Нет зависимостей, и fiscalyear
должен работать как для Python 2, так и для 3.
Это в основном оболочка вокруг встроенного модуля datetime, поэтому любые команды datetime
которыми вы уже знакомы, будут работать. Вот демо:
>>> 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
размещен на GitHub и PyPI. Документацию можно найти в разделе "Чтение документов". Если вы ищете какие-либо функции, которых у вас нет в данный момент, дайте мне знать!
Ответ 5
если m
- номер месяца...
import math
math.ceil(float(m) / 3)
Ответ 6
Это старый вопрос, но все же достойный обсуждения.
Вот мое решение, используя отличный 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)
Итак, first_day
- это первый день квартала, а last_day
- последний день квартала (рассчитывается путем поиска первого дня следующего квартала, минус один день).
Ответ 7
hmmm, поэтому вычисления могут пойти не так, вот лучшая версия (только ради этого)
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]
Ответ 8
Вот подробное, но также читаемое решение, которое будет работать для экземпляров даты и времени
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
Ответ 9
Для тех, кто ищет данные финансового квартала, используя панды,
import datetime
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
ссылка: индекс периода панды
Ответ 10
Этот метод работает для любого сопоставления:
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
Мы только что сгенерировали функцию int->int
month2quarter(9) # returns 3
Этот метод также является безупречным
month2quarter(-1) # returns None
month2quarter('July') # returns None