2017-10-04 5 views
1

저는 파이썬에서 시작 및 종료 날짜를 나타내는 두 개의 열이있는 pandas DataFrame을 보유하고 있습니다. 간격 사이에 날짜가 [시작하면, 끝) 시작 - 종료 날짜의 각 쌍에 대해, 팬더를 사용하여 주말을 포함하는 날짜 범위를 찾으십시오.

  • 는 결정 ... 입력으로 종료 날짜로 시작으로 두 팬더 시리즈를

    • 을 감안할 때 : 는 내가 원하는 (시작을 포함 하나 끝은 제외)은 금요일이나 토요일 중 하나입니다 ...
    • 팬더 시리즈를 부울로 출력합니다.
    • 2M 행 이상으로 작업 할 때 솔루션이 상대적으로 빠릅니다.

      has_weekend 
      TRUE 
      FALSE 
      FALSE 
      TRUE 
      TRUE 
      

      내 현재의 접근 방식은 가까운 2M 행에있는 DataFrame에 대한 매우 느린 : 내가 좋아하는 뭔가를 기대하는 것

      start  end 
      2013-08-02 2013-08-04 
      2014-11-24 2014-11-28 
      2013-10-29 2013-10-31 
      2013-12-06 2013-12-10 
      2014-08-15 2014-08-17 
      

      : 같은

    데이터 집합 보인다. 코드는 다음과 같습니다.

    df.apply(lambda x: np.any(np.in1d([d.weekday() for d in pd.date_range(x.start, x.end)],[4,5])), axis=1) 
    

    아이디어가 있으십니까?

    솔루션 가장 빠른 해결책이었다 내가이이해야 할 몇 가지 논리 연산자와 생각 @Anton VBR의

    s = df.start.dt.dayofweek 
    e = df.end.dt.dayofweek 
    dt = (df.end- df.start).dt.days 
    has_weekend = (((s >= 4) & (s != 6)) | (e>=5) | ((e < s) & (s != 6)) | (dt >= 6)) 
    
  • +0

    질문에 데이터가 부족하면 도움이되지 않습니다. –

    +0

    @ cᴏʟᴅs more 더 명확하게하기 위해 데이터 스 니펫을 추가했습니다. – dandroid

    +0

    이 입력에 대해 예상되는 것은 무엇입니까? '0, 1, 3, 4'? –

    답변

    2

    에서 수정 대답, 그러나 그들은 작은에서 언제든지 개선되지 않습니다 내가 테스트 세트.

    s = df.start.dt.dayofweek 
    e = df.end.dt.dayofweek 
    (((s >= 4) & (s != 6)) | ((e>=4) & (s != 6)) | (e < s)) 
    
    +0

    이것은 거의 내가 찾던 해답 이었지만 분명히 일을 가속화했습니다 ... 내 초기 솔루션을 실행하는 데 15 분이 걸리는 반면 수정 된 솔루션은 15 초가 걸렸습니다. (개조 없이는 450ms가 걸렸지 만 날짜 사이에는 장시간을 차지하지 못했습니다.) 필자는 편집 결과에 대한 답변을 게시했습니다. – dandroid

    +0

    @ dandroid 그것은 당신을 위해 다행 다행. 행운을 빕니다! –