2016-08-11 1 views
1

나는 역 식별자 코드 ('usaf')와 날짜로 구성된 지표 기상 관측치 (fzraHrObs)의 데이터 프레임을 가지고 있습니다. fzraHrObs에는 기상 데이터의 여러 열이 있습니다. 내가 원하는날씨 "이벤트"는 팬더의 시간차에 따라 그룹화됩니다.

usaf  dat 
716270 2014-11-23 12:00:00 
      2015-12-20 08:00:00 
      2015-12-20 12:00:00 
716280 2015-12-19 08:00:00 
      2015-12-19 09:00:00 

관찰이 같은 이벤트의 이전 관측 카운트 후 < 6 시간 발생하는 역으로 '이벤트'로 그룹에 이러한 관찰을 : 같은 역 코드와 날짜 (날짜 오브젝트)를 찾습니다. 그런 다음 이벤트의 시작 시간, 종료 시간 및 수를 데이터 프레임에 출력하려고합니다. 위의 예제 데이터를 감안할 때,이 같은 것을보고 출력을 싶습니다

usaf  eventNum start    end      count 
716270 1   2014-11-23 12:00:00 2014-11-23 12:00:00  1 
      2   2015-12-20 09:00:00 2015-12-20 12:00:00  2  
716280 1   2015-12-19 08:00:00 2015-12-19 09:00:00  2 

을 나는 현재 루프와 dicts하지만 팬더 물건을 전환하기 일하고 그것이이었다 때문에 경우에 대한/함께이 일을 해요 훨씬 더 효율적입니다.

내 초기 생각은 각 행을 그룹별로 그룹화하고 몇 시간 만에 한 번씩 차이를 쳐서 이것을 보여주는 열 'diff'가 있습니다. 나는 이벤트 시작/종료/지속 시간을 얻는 방법을 알아 내는데 어려움을 겪고있다. 나는 fzraHrObs [fzraHrObs [ 'diff']> = 6]와 관련된 뭔가도 포함될 것으로 추측하고 있습니다.

+0

5 시간 간격으로 세 번 관찰 한 경우 세 번째 관찰은 동일한 이벤트로 계산됩니다 (이전 이벤트가 발생한 후 6 시간 이내에 발생). 또는 새 이벤트입니까? 초기 이벤트 후 6 시간)? – IanS

+0

좋은 질문입니다. 예 - 세 번째 이벤트는 동일한 이벤트로 계산됩니다. 이벤트 내의 각 관찰은 5 시간 이하로 분리 할 수 ​​있습니다. – MeteoMtl

답변

2

귀하의 의견에 대한 답은 단순히 이전 이벤트로 돌아 가야하므로 루프를 피하는 것이 쉽다는 것을 의미합니다.

df['new_event'] = df.groupby('usaf')['dat'].apply(lambda s: s.diff().dt.seconds > 6*3600) 

출력 :

 usaf     dat new_event 
0 716270 2014-11-23 12:00:00  False 
1 716270 2015-12-20 08:00:00  True 
2 716270 2015-12-20 12:00:00  False 
3 716280 2015-12-19 08:00:00  False 
4 716280 2015-12-19 09:00:00  False 

True 값에서 이벤트의 수를 증가 :

df['event'] = df.groupby('usaf')['new_event'].cumsum().astype('int') 

출력 : 이벤트로

 usaf     dat new_event event 
0 716270 2014-11-23 12:00:00  False  0 
1 716270 2015-12-20 08:00:00  True  1 
2 716270 2015-12-20 12:00:00  False  1 
3 716280 2015-12-19 08:00:00  False  0 
4 716280 2015-12-19 09:00:00  False  0 

이제 그룹 및 agg를 사용하려면 시작과 끝 날짜를 얻을 firstlast를 포함한 여러 기능을 적용

df.groupby(['usaf', 'event'])['dat'].agg(['first', 'last', 'count']) 

출력 :

      first    last count 
usaf event            
716270 0  2014-11-23 12:00:00 2014-11-23 12:00:00  1 
     1  2015-12-20 08:00:00 2015-12-20 12:00:00  2 
716280 0  2015-12-19 08:00:00 2015-12-19 09:00:00  2 

모든 것은이 인덱스를 정리 할 일은 남아!

+0

이것은 우수합니다 - 정말 고마워요! 며칠 전부터 판다를 사용하기 시작 했으므로 예제가 도움이됩니다. agg 함수는 내가 작업하고있는 것에 매우 편리합니다. – MeteoMtl

+0

통찰력을 제공 할 수있는 또 다른 질문은 다음과 같습니다. 24 시간 미만으로 분리 된 이벤트 - 즉 이전 이벤트가 종료 된 후 24 시간 이내에 새 이벤트가 시작되는 위치를 별도로 결합하고자합니다. 이 경우 나는 (start [idx] - end [idx-1]) 같은 것을 볼 필요가있다. 이 작업을 수행하는 가장 좋은 방법은 원본 fzraHrObs df를 이벤트 #/new_event 열과 함께 사용하는 것입니다. – MeteoMtl

+1

실제로 이것을 알아 냈습니다.나는 현재 행의 시간과 이전 행의 시간의 차이가있는 열을 만들었습니다 : fzraHrObs [ 'prev_dat'] = fzraHrObs [ 'dat'] groupby ([fzraHrObs [ 'usaf']]) shift (1) 그들 사이의 차이. 그 후 그 차이가 24 시간 미만인지 아닌지를 확인하고 그렇지 않으면 new_event를 false로 설정합니다. fzraHrObs.ix [fzraHrObs.timedif <24, 'new_event'] = 거짓 이 코드 블록은 위의 cumsum 및 agg 행 앞에 있습니다. – MeteoMtl