2016-05-13 10 views
-1

私はいくつかのジョブを開始する前に考慮する必要があるブラックアウトの日付を持っているプロジェクトで作業しようとしています。私はこのような停電の日付のJSONセットを取得日付の範囲をPythonで処理する最良の方法

:下記の例を説明する

blackout1: 
     startTime: 1-1-2016 
     endTime: 1-10-2016 
blackout2: 
     startTime: 1-5-2016 
     endTime: 1-11-2016 
blackout3: 
     startTime: 2-2-2016 
     endTime: 2-3-2016 

あなたがそれらのいくつかは重なって見ることができるといくつかのではないそうであるように。私はまた、以下のように特定の日付に実行するジョブのリストを取得する:

job1: 
    runDate: 1-3-2016 
job2: 
    runDate: 1-13-2016 

それがブラックアウト日に予定していないので、そう私の例では唯一のJOB2を実行する必要があります。 私の方法では、startTimeとendTimeの2つのセットを作成し、startTimeセットの最初の日付とendTimeの最後の日付を、ジョブを通過するときの最初のチェックの範囲として使用します。ジョブがこの範囲外の場合は実行するようにスケジュールを設定しますが、この範囲内にある場合はすべての日付に対してチェックします。私はパフォーマンスが向上するようにこの方法を取っているので、ジョブがこの範囲内にない場合は、すべてのブラックアウト日付をループしません。 これがこのシナリオを処理する最良の方法であるかどうか、私が最高のデータ構造を使用しているかどうかはわかりません。

さらなる考えを探しています。

ありがとうございます!

+0

ブラックアウトの日付があまりにも多く、単純な直線的な通過がすべて遅すぎますか? –

答えて

0

あなたが直接日付を比較することができますので、あなたは、まったくのループを必要としない:

date1 = datetime.date(2000, 1, 1) 
date2 = datetime.date(2002, 1, 1) 

print(date1 < datetime.date(2001, 1, 1) < date2) 
>> True 
0

あなたは別の開始時刻と終了時刻に各範囲を分割し、それらを並べ替える場合は、あなたが伝え単一のリストを生成することができます時間がすべての範囲の外にあるかどうか、あなたはあなたになります。リストをトラバースするだけで、開始時間に達したときにカウンタをインクリメントし、終了時間に達したときにカウンタを減少させます。カウンタがゼロの場合、範囲内のではなく、となります。リスト内の各エントリにカウンタを格納するか、0または1以外のカウントを残す各開始/終了時間を取り出してリストを圧縮することができます。bisect moduleを使用して、結果のリストをバイナリ検索できます。リストを圧縮した場合、カウントまたはフラグを保持する必要はありません。bisect_rightは範囲外の偶数と範囲内の奇数を返します。

関連する問題