날짜가 어느 분기에 있는지 확인하는 Python 함수가 있습니까?
물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미 이것을 수행하는 함수가 있습니까?
인스턴스 감안할 x
의 datetime.date , (x.month-1)//3
당신이 ;-) 대신 1에서 계산해야하는 경우 하나를 추가 - 등, 2 분기, 1 분기 당신이 1 분기 (0을 줄 것이다.
원래 두 개의 답변, 곱하기 upvoted 및 원래 수락 된 (현재 모두 삭제됨)은 버그가있었습니다 -1
. 나눗셈 이전을 수행하지 않고 3 대신 4로 나누었습니다. .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
-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
종속성이 없으며 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
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))
'programing tip' 카테고리의 다른 글
C #에서 익명 형식 반환 (0) | 2020.09.07 |
---|---|
내부 저장소에서 파일 삭제 (0) | 2020.09.07 |
@ Html.HiddenFor는 ASP.NET MVC의 목록에서 작동하지 않습니다. (0) | 2020.09.07 |
WAMP가 녹색으로 바뀌지 않습니다. (0) | 2020.09.07 |
Ruby 클래스 이름을 밑줄로 구분 된 기호로 어떻게 변환합니까? (0) | 2020.09.07 |