Есть ли функция Python, чтобы определить, в каком квартале года находится дата?



конечно, я мог бы написать это сам, но прежде чем я пойду изобретать колесо есть ли функция, которая уже делает это?

1681   9  

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. Документацию можно найти по адресу читать документы. Если вы ищете какие-либо функции, которые он в настоящее время не имеет, дайте мне знать!

Если m число месяца...

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

Это старый вопрос, но все-таки достойны обсуждения.

вот мое решение, используя прекрасные 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

    Ничего не найдено.