2014-10-30 3 views
2

나는 판다에 대해 상당히 새롭고로드 블록을 실행 중입니다. 타임 스탬프가 포함 된 데이터 프레임이 있습니다. 사용자 정의 기간 이름 (문자열)을 포함 할 데이터 프레임에 열을 추가하고 싶습니다. 예를 들어 :사용자 정의 기간에 Bin 타임 스탬프 입력

df = pd.DataFrame(pd.date_range('01-01 00:00', periods='72', freq='H')) 

나는 사용자 정의 기간의 이름을 포함 할 열 df['Periods']를 작성하고 싶습니다. 예를 들어 타임 스탬프가 01-01 00:0001-02 00:00 사이 인 경우 Period1, 그렇지 않은 경우 Period2입니다.

cut을 사용하려고 생각했지만 bin 속성은 정수만 사용하는 것 같습니다.

무엇을 하시겠습니까?

감사합니다.

답변

1

df 초기화에서 periods은 문자열이 아닌 숫자 여야합니다.

나는 이것을 처리하는 방법이 당신이 갖고 싶은 기간에 달려 있다고 생각합니다.

설정 기간 :

from datetime import time 

morning_start = time(7) 
morning_end = time(12) 
evening_start = time(18) 
evening_end = time(22) 

periods = {'morning':[morning_start, morning_end], 'evening':[evening_start, evening_end]} 

접근 1.

def f(x, periods=periods): 
    for k, v in periods.items(): 
     if x.hour >= v[0].hour and x.hour < v[1].hour: 
      return k 
    return 'unknown_period' 

접근 2.

for k, v in periods.items(): 
    df['periods'] = np.where(((v[0].hour <= df.t.apply(lambda x: x.hour)) & (df.t.apply(lambda x: x.hour) <= v[1].hour)), k, 'unknown_period') 

두 기간으로

가지 방법으로 적어도 몇 있습니다 첫 번째 앱이 정의 됨 oach 빠르게 작동합니다

1000 loops, best of 3: 658 µs per loop 

대 2 :

: 당신이합니다 ( periods을 반복 할 필요없이) 한 줄 표현을 만들 수있는 두 기간을 가진 두 경우 모두

100 loops, best of 3: 3.31 ms per loop 

df['periods'] = np.where((morning_start.hour <= df.t.apply(lambda x: x.hour)) & (df.t.apply(lambda x: x.hour) <= morning_end.hour), 'morning', 'evening')  
+0

정확히 내가 필요한 것입니다. 자세한 답변을 주셔서 감사합니다. –

관련 문제