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

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

Ответы [ 12 ]

133 голосов
/ 10 сентября 2009

Учитывая экземпляр 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 модуль для использования моих (и других) проектов на работа, которая имеет много небольших функций для выполнения всех этих календарных вычислений - некоторые являются сложными, некоторые - простыми, но нет причин выполнять эту работу снова и снова (даже простую работу) или создавать ошибки в таких вычислениях; -).

31 голосов
/ 29 февраля 2016

ЕСЛИ вы уже используете 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
23 голосов
/ 13 января 2011

Я бы предложил другое, возможно, более чистое решение. Если X является datetime.datetime.now() экземпляром, то квартал будет:

import math
Q=math.ceil(X.month/3.)

ceil должен быть импортирован из математического модуля, так как к нему нельзя получить прямой доступ.

7 голосов
/ 06 мая 2017

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

2 голосов
/ 26 февраля 2015

, если m - номер месяца ...

import math
math.ceil(float(m) / 3)
1 голос
/ 06 декабря 2018

Этот метод работает для любого отображения:

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
1 голос
/ 06 сентября 2018

Для тех, кто ищет данные за квартал финансового года, используя панд,

import datetime
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')

ссылка: Индекс периода панд

1 голос
/ 07 декабря 2012

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

Вот мое решение, использующее превосходный модуль 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 - последний день квартала (рассчитывается путем нахождения первого дня следующего квартала минус один день).

0 голосов
/ 26 марта 2019

используя словари, вы можете сделать это на

def get_quarter(month):
    quarter_dictionary = {
        "Q1" : [1,2,3],
        "Q2" : [4,5,6],
        "Q3" : [7,8,9],
        "Q4" : [10,11,12]
    }

    for key,values in quarter_dictionary.items():
        for value in values:
            if value == month:
                return key

print(get_quarter(3))
0 голосов
/ 14 февраля 2019

Вот пример функции, которая получает объект datetime.datetime и возвращает уникальную строку для каждого квартала:

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))

И вывод:

2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...