9 ответов:
данный экземпляр
xна дата и время.дата,(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 обязательно должен иметь все возможные полезные функции calendric, но я знаю, что поддерживаю (хорошо протестированный; -)
datetoolsмодуль для использования моего (и других) проекты на работе, которые имеют много маленьких функций для выполнения всех этих календарных вычислений - некоторые из них сложны, некоторые просты, но нет причин делать работу снова и снова (даже простая работа) или рисковать ошибками в таких вычислениях;-).
если вы уже используете
pandas, это очень просто.import datetime as dt import pandas as pd quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter assert quarter == 1если у вас
dateстолбец в фрейме данных, вы можете легко создать новый
Я бы предложил другое, возможно, более чистое решение. Если Х
datetime.datetime.now()экземпляр, то четверть:import math Q=math.ceil(X.month/3.)ceil должен быть импортирован из математического модуля, так как он не может быть доступен напрямую.
для тех, кто пытается получить четверть финансовые год, который может отличаться от календарь год, я написал модуль 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. Документацию можно найти по адресу читать документы. Если вы ищете какие-либо функции, которые он в настоящее время не имеет, дайте мне знать!
Это старый вопрос, но все-таки достойны обсуждения.
вот мое решение, используя прекрасные 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в последний день квартала (рассчитывается путем нахождения первого дня следующего квартала, минус один день).
хммм так что расчеты могут пойти не так, вот лучшая версия (просто ради этого)
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]
вот подробное, но также читаемое решение, которое будет работать для экземпляров datetime и 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
для тех, кто ищет данные за квартал финансового года, используя панд,
import datetime today_date = datetime.date.today() quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')ссылка: период панд
Comments