2017-10-04 15 views
1

私は、開始日と終了日を示す2つの列を持つPythonでpandas DataFrameを持っています。インターバルの間に任意の日付は、[開始した場合、エンド)、開始終了日の各ペアのために、 パンダを使用して週末を含む日付範囲を探す

  • が決定...入力として終了日として開始ように2頭のパンダシリーズを

    • を考える: は私がしたいです(始点を含むが終点を除く)は、金曜日または土曜日のいずれかです。
    • pandas Seriesをブール値として出力します。
    • 解決策は、2M以上の行を処理しているので、比較的高速である必要があります。

    データセットは以下のようになります。

    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 
    

    私のような何かを期待されるだろう:

    has_weekend 
    TRUE 
    FALSE 
    FALSE 
    TRUE 
    TRUE 
    

    を私の現在のアプローチは、2M行の近くにありDATAFRAMEのために非常に遅いです。

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

    任意のアイデア: ここでは、コードですか?

    SOLUTION 最速の解決策は、しかし、彼らは小さな上の任意の時間の改善はありませんが、私はいくつかの論理演算子について考え、これらが何をすべき@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ᴏʟᴅsmoreもっと分かりやすくするために、データのスニペットを追加しました。 – 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

    @ダンドロイドそれはあなたのために働いてうれしい。がんばろう! –

    関連する問題