물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미이 작업을 수행하는 함수가 있습니까?
pandas.Series.dt.quarter
있습니다..
물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미이 작업을 수행하는 함수가 있습니까?
pandas.Series.dt.quarter
있습니다..
답변:
인스턴스 감안할 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
직장에서 내 (그리고 다른 사람의) 프로젝트를 사용하기 위해 (잘 테스트 된 ;-) 모듈을 유지하고 있다는 것을 알고 있습니다. 이러한 모든 캘린더 계산을 수행하는 함수-일부는 복잡하고 일부는 간단하지만 반복적으로 작업 할 이유가 없거나 (심지어 단순한 작업 일지라도) 그러한 계산에서 버그를 위험에 빠뜨릴 이유가 없습니다 .-).
(m+2)//3
대신(m-1)//3 + 1
이미을 사용 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
pandas.Series.dt.quarter
는 Dataframe 또는 Series 개체 에 날짜 시간 값이있을 때 이상적인 솔루션 입니다.
나는 또 다른 더 깨끗한 해결책을 제안 할 것이다. X가 datetime.datetime.now()
인스턴스 인 경우 분기는 다음과 같습니다.
import math
Q=math.ceil(X.month/3.)
ceil은 직접 액세스 할 수 없으므로 math 모듈에서 가져와야합니다.
math.ceil(float(4)/3) = 2.0
동안math.ceil(4/3) = 1.0
.
3 이후가 무엇을했는지 몰랐습니다. math.ceil(4/3.) = 2.0
달력 연도 와 다를 수 있는 회계 연도 의 분기를 얻으려는 사람을 위해이 작업을 수행하는 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 에서 호스팅됩니다 . 문서는 문서 읽기에서 찾을 수 있습니다 . 현재 가지고 있지 않은 기능을 찾고 있다면 알려주세요!
다음은 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
pandas를 사용하여 회계 연도 분기 데이터를 찾는 사람들을 위해,
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
참고 : 판다 스 시대 지수
이것은 오래된 질문이지만 여전히 토론 할 가치가 있습니다.
다음은 우수한 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
의 마지막 날입니다 (다음 분기의 첫 번째 날에서 하루를 뺀 날짜를 찾아 계산 됨).
음, 계산이 잘못 될 수 있으므로 여기에 더 나은 버전이 있습니다.
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]
"it is difficult to see correctness except by testing it"
. 모든 좋은 개발자가해야하는 것처럼 테스트를 작성해야합니다. 테스트는 실수를 방지하고 실수를 포착하는 데 도움이됩니다. 개발자는 실수를 방지하기 위해 성능과 가독성을 희생해서는 안됩니다. 또한 이것은 리터럴을 사용하여 정적 dict를 만드는 것보다 읽기 어렵습니다.
(m-1)//3 + 1
읽을 수있는 것은 아닙니다. 많은 사람들이 무엇을하는지 알지 //
못합니다. 내 원래 의견은 "calculations can go wrong"
나에게 이상하게 들리는 진술에 대한 것이었다 .