programing tip

날짜가 어느 분기에 있는지 확인하는 Python 함수가 있습니까?

itbloger 2020. 9. 7. 07:52
반응형

날짜가 어느 분기에 있는지 확인하는 Python 함수가 있습니까?


물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미 이것을 수행하는 함수가 있습니까?


인스턴스 감안할 xdatetime.date , (x.month-1)//3당신이 ;-) 대신 1에서 계산해야하는 경우 하나를 추가 - 등, 2 분기, 1 분기 당신이 1 분기 (0을 줄 것이다.


원래 두 개의 답변, 곱하기 upvoted 및 원래 수락 된 (현재 모두 삭제됨)은 버그가있었습니다 -1. 나눗셈 이전을 수행하지 않고 3 대신 4로 나누었습니다. .month1에서 12로 이동 하므로 수식이 무엇인지 직접 확인하기 쉽습니다. 권리:

for m in range(1, 13):
  print m//4 + 1,
print

제공 1 1 1 2 2 2 2 3 3 3 3 4-2 개의 4 개월 분기 및 1 개월 1 (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직장에서 내 (그리고 다른 사람의) 프로젝트를 사용하기 위해 (잘 테스트 된 ;-) 모듈을 유지하고 있다는 것을 알고 있습니다. 이러한 모든 캘린더 계산을 수행하는 함수-일부는 복잡하고 일부는 간단하지만 반복적으로 작업 할 이유가 없거나 (심지어 단순한 작업 일지라도) 그러한 계산에서 버그를 위험에 빠뜨릴 이유가 없습니다 .-).


이미을 사용 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

나는 또 다른 더 깨끗한 해결책을 제안 할 것이다. X가 datetime.datetime.now()인스턴스 인 경우 분기는 다음과 같습니다.

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

ceil은 직접 액세스 할 수 없으므로 math 모듈에서 가져와야합니다.


달력 연도 와 다를 수 있는 회계 연도 의 분기를 얻으려는 사람을 위해이 작업을 수행하는 Python 모듈을 작성했습니다.

설치가 간단합니다. 그냥 실행 :

$ pip install fiscalyear

종속성이 없으며 fiscalyearPython 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 is hosted on GitHub and PyPI. Documentation can be found at Read the Docs. If you're looking for any features that it doesn't currently have, let me know!


if m is the month number...

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

This is an old question but still worthy of discussion.

Here is my solution, using the excellent dateutil module.

  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)

So first_day is the first day of the quarter, and last_day is the last day of the quarter (calculated by finding the first day of the next quarter, minus one day).


For those, who are looking for financial year quarter data, using pandas,

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

reference: pandas period index


This method works for any mapping:

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

We have just generated a function int->int

month2quarter(9) # returns 3

This method is also fool-proof

month2quarter(-1) # returns None
month2quarter('July') # returns None

Here is an example of a function that gets a datetime.datetime object and returns a unique string for each quarter:

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

And the output is:

2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017

hmmm so calculations can go wrong, here is a better version (just for the sake of it)

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]

Here is a verbose, but also readable solution that will work for datetime and date instances

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

using dictionaries, you can pull this off by

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

참고URL : https://stackoverflow.com/questions/1406131/is-there-a-python-function-to-determine-which-quarter-of-the-year-a-date-is-in

반응형