2017-10-24 1 views
1

datetime으로 인덱싱 된 데이터 프레임이 있습니다. 인덱스와 이전 행의 인덱스 사이의 차이를 기반으로 행을 필터링하려고합니다. 내 기준은 "한 시간 이상 이전 행보다 늦게 모든 행을 제거하는"경우인접한 행의 차이로 팬더 데이터 프레임 필터링

가 그래서, 아래의 예에서 두 번째 행을 제거해야합니다

2005-07-15 17:00:00 
2005-07-17 18:00:00 

다음과 같은 경우에 동안, 두 행이있을 : 것 같다

2005-07-17 23:00:00 
2005-07-18 00:00:00 
+0

'2005년 7월 15일 17시 0분 0초, 2005년 7월 17일 18시 0분 0초, 2005년 7월 17일 19시에 19:00 어떻게해야하는지 : 00' –

+0

이지만 2005-07-17 23 : 00 : 00-2005-07-18 00:00 : 00 사이의 시간 간격은 1 시간입니다. 삭제하지 않으시겠습니까? 이 시리즈의 – jezrael

+0

:'pd.Timestamp ('20170101') + pd.to_timedelta ([- 1, 0, 1, 2, 3, 5, 6.5, 7.5], 단위 = 'h')', 어떤 것을 보관해야합니까? –

답변

2

당신이 차이를 diffboolean indexing을 필요 1 hour Timedelta 비교 :

dates=['2005-07-15 17:00:00','2005-07-17 18:00:00', '2005-07-17 19:00:00', 
     '2005-07-17 23:00:00', '2005-07-18 00:00:00'] 
df = pd.DataFrame({'a':range(5)}, index=pd.to_datetime(dates)) 

print (df) 
        a 
2005-07-15 17:00:00 0 
2005-07-17 18:00:00 1 
2005-07-17 19:00:00 2 
2005-07-17 23:00:00 3 
2005-07-18 00:00:00 4 

diff = df.index.to_series().diff().fillna(0) 
print (diff) 
2005-07-15 17:00:00 0 days 00:00:00 
2005-07-17 18:00:00 2 days 01:00:00 
2005-07-17 19:00:00 0 days 01:00:00 
2005-07-17 23:00:00 0 days 04:00:00 
2005-07-18 00:00:00 0 days 01:00:00 
dtype: timedelta64[ns] 

mask = diff <= pd.Timedelta(1, unit='h') 
print (mask) 
2005-07-15 17:00:00  True 
2005-07-17 18:00:00 False 
2005-07-17 19:00:00  True 
2005-07-17 23:00:00 False 
2005-07-18 00:00:00  True 
dtype: bool 

df = df[mask] 
print (df) 
        a 
2005-07-15 17:00:00 0 
2005-07-17 19:00:00 2 
2005-07-18 00:00:00 4 
관련 문제