물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미이 작업을 수행하는 함수가 있습니까?
pandas.Series.dt.quarter있습니다..
물론 내가 직접 작성할 수는 있지만 바퀴를 재발 명하기 전에 이미이 작업을 수행하는 함수가 있습니까?
pandas.Series.dt.quarter있습니다..
답변:
인스턴스 감안할 x의 datetime.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직장에서 내 (그리고 다른 사람의) 프로젝트를 사용하기 위해 (잘 테스트 된 ;-) 모듈을 유지하고 있다는 것을 알고 있습니다. 이러한 모든 캘린더 계산을 수행하는 함수-일부는 복잡하고 일부는 간단하지만 반복적으로 작업 할 이유가 없거나 (심지어 단순한 작업 일지라도) 그러한 계산에서 버그를 위험에 빠뜨릴 이유가 없습니다 .-).
(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
종속성이 없으며 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)
fiscalyearGitHub 및 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"나에게 이상하게 들리는 진술에 대한 것이었다 .