Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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