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


113

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


22
초기 답변이 다소 무시하는 것처럼 보이지만 ( "그냥 문제", "매우 간단 해 보임") 질문은 매우 타당합니다. 답변 중 두 개 (UPVOTED 답변 포함!)는 끔찍하게 버그가있어서 그다지 간단하지 않습니다. " just "...
Alex Martelli

나는 그가이 다시 와서 고칠 거라고 확신
나디아 Alramli

D : 2018 년 매우 도움이 질문에
wdfc

datetime 객체가 Pandas Series 또는 Dataframe에 저장되는 경우 해당 분기를 반환하는 메서드가 pandas.Series.dt.quarter있습니다..
Sumanth Lazarus

답변:


162

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


3
고마워 Alex. 이것이 기능이 있어야하는 이유입니다. 얼마나 많은 사람들이 틀렸는 지보세요.
Jason Christa

나는 당신이 당신의 요점을 증명했다고 생각합니다. 반복되는 댓글로 전체 페이지를 오염시킬 필요가 없습니다.
João Silva

1
@Jason, 예, 정확합니다. 다른 버그가있는 답변 (현재 삭제됨)을 보았을 때 다른 사람이 내 찬성표를 계산하기 위해 반대표를 던진 것처럼 보이지만 그게 제가 질문을 찬성 한 이유입니다.
Alex Martelli

1
@JG, 무슨 "반복 코멘트"? 버그가있는 답변이 삭제됨에 따라 댓글이 없어져서 답변에 내용을 가져 왔습니다. 간단한 계산으로도주의가 산만 해 지거나 서두르는 것이 얼마나 쉬운 지 인식하고 피할 수있는 버그를 얻는 것이 중요합니다. 그리고 그것은 (재사용 가능한 함수를 만들고 견고하게 테스트하는 측면에서) 모범 사례를 프로그래밍하는 데 영향을 미칩니다. 이 사건은 좋은 예입니다 (질문이 정당하다는 것을 증명한다고 생각합니다).
Alex Martelli

7
또한 사용할 수 : (m+2)//3대신(m-1)//3 + 1

49

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

회계 연도 분기가 9 월에 시작되면 어떻게됩니까?
Arthur D. Howland

Pandas 메서드 pandas.Series.dt.quarterDataframe 또는 Series 개체 에 날짜 시간 값이있을 때 이상적인 솔루션 입니다.
Sumanth Lazarus

31

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

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

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


1
지금까지 가장 좋은 것. 정말 감사합니다!
curlyreggie

3
아마하는 int ()이 포장한다
Pablojim

@garbanzio 답변이 제안한 것처럼. 나는이 작업을 얻을 수있는 부동 소수점 기능을 통해 월 인수를 넣어 필요 math.ceil(float(4)/3) = 2.0동안math.ceil(4/3) = 1.0
테오 Kouzelis

1
나는 .3 이후가 무엇을했는지 몰랐습니다. math.ceil(4/3.) = 2.0
Theo Kouzelis

11

달력 연도 와 다를 수 있는 회계 연도 의 분기를 얻으려는 사람을 위해이 작업을 수행하는 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)

fiscalyearGitHubPyPI 에서 호스팅됩니다 . 문서는 문서 읽기에서 찾을 수 있습니다 . 현재 가지고 있지 않은 기능을 찾고 있다면 알려주세요!


4

다음은 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


2

이 방법은 모든 매핑에 적용됩니다.

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

2

pandas를 사용하여 회계 연도 분기 데이터를 찾는 사람들을 위해,

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

참고 : 판다 스 시대 지수


1

이것은 오래된 질문이지만 여전히 토론 할 가치가 있습니다.

다음은 우수한 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의 마지막 날입니다 (다음 분기의 첫 번째 날에서 하루를 뺀 날짜를 찾아 계산 됨).


1

이것은 매우 간단하며 python3에서 작동합니다.

from datetime import datetime

# Get current date-time.
now = datetime.now()

# Determine which quarter of the year is now. Returns q1, q2, q3 or q4.
quarter_of_the_year = 'q'+str((now.month-1)//3+1)

0

음, 계산이 잘못 될 수 있으므로 여기에 더 나은 버전이 있습니다.

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]

이 경우 @RussBradberry가 맞을 수도 있지만 간결한 계산 대신 가독성과 명시적인 계산이 중요하고 오류가 적습니다.
Anurag Uniyal 2013

1
@RussBradberry는 또한 그것에 대한 삭제 된 답변과 코멘트를 볼 수 있습니다. 간단한 계산은 좋은 프로그래머에게도 까다로울 수 있으며 테스트하는 것 외에는 정확성을보기가 어렵습니다. 제 솔루션에서 작동하는지 확인하고 확인할 수 있습니다.
Anurag Uniyal

1
당신이 말한대로 "it is difficult to see correctness except by testing it". 모든 좋은 개발자가해야하는 것처럼 테스트를 작성해야합니다. 테스트는 실수를 방지하고 실수를 포착하는 데 도움이됩니다. 개발자는 실수를 방지하기 위해 성능과 가독성을 희생해서는 안됩니다. 또한 이것은 리터럴을 사용하여 정적 dict를 만드는 것보다 읽기 어렵습니다.
Russ Bradberry 2013

오해하지 마십시오. 그다지 (m-1)//3 + 1읽을 수있는 것은 아닙니다. 많은 사람들이 무엇을하는지 알지 //못합니다. 내 원래 의견은 "calculations can go wrong"나에게 이상하게 들리는 진술에 대한 것이었다 .
Russ Bradberry 2013

@RussBradberry 사실 나는 당신에게 내 대답은 대안으로 동의하고 때때로 사람들이지도에서 하드 코딩 될 수있는 것을 계산 / 추론하려고하는 많은 코드를 본 대안이 있습니다
Anurag Uniyal

0

다음은 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

0

사전을 사용하면

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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.