2016-05-28 9 views
1

私は開始日の列と終了日の列を持つデータフレームを持っています。開始日が終了日より前であることを確認して、日付の完全性をチェックします(start_date < end_date).14,000回以上の観測があります。私はちょうどので、私はそれらを削除することができ、誤ったものがあるかどうかをハイライトしたいにもかかわらず、に結果を書き込むために列を追加したPythonで2つの列の日付を効率的に比較する

Start  End 
0 2008-10-01 2008-10-31 
1 2006-07-01 2006-12-31 
2 2000-05-01 2002-12-31 
3 1971-08-01 1973-12-31 
4 1969-01-01 1969-12-31 

は私がの形式でデータを持っている

dates['Correct'] = " " 

し、次を使用して、各日付のペアをチェックし始めている、私のデータフレームが呼び出された日付:

for index, row in dates.iterrows(): 
    if dates.Start[index] < dates.End[index]: 
     dates.Correct[index] = "correct" 
    elif dates.Start[index] == dates.End[index]: 
     dates.Correct[index] = "same" 
    elif dates.Start[index] > dates.End[index]: 
     dates.Correct[index] = "incorrect" 

これは、本当に本当に長い時間(約15分)を取っているだけです。より効率的に実行するコードが必要です - 私が間違っていることや改善できることがありますか?

+1

最後の 'elif'を削除し、' else'で置き換えてください。 – Deepanshu

答えて

2

ベクトル化された方法ではないのはなぜですか:

is_correct = dates['Start'] < dates['End'] 
is_incorrect = dates['Start'] > dates['End'] 
is_same = ~is_correct & ~is_incorrect 
+0

ありがとうございます!シンプルでとても速い! – emboylen

1

リストを順番に比較する必要はないため、データセットを分割し、複数のプロセスを使用して比較を同時に実行することでパフォーマンスを向上させることができます。ヘルプについてはmultiprocessingモジュールをご覧ください。次のような

0

何かが速くなることがあります。

import pandas as pd 
import datetime 

df = pd.DataFrame({ 
    'start': ["2008-10-01", "2006-07-01", "2000-05-01"], 
    'end': ["2008-10-31", "2006-12-31", "2002-12-31"], 
}) 


def comparison_check(df): 
    start = datetime.datetime.strptime(df['start'], "%Y-%m-%d").date() 
    end = datetime.datetime.strptime(df['end'], "%Y-%m-%d").date() 
    if start < end: 
     return "correct" 
    elif start == end: 
     return "same" 
    return "incorrect" 

In [23]: df.apply(comparison_check, axis=1) 
Out[23]: 
0 correct 
1 correct 
2 correct 
dtype: object 

タイミング私の計算によるので

In [26]: %timeit df.apply(comparison_check, axis=1) 
1000 loops, best of 3: 447 µs per loop 

、14,000行を取る必要があります(3分の447)* 14000 =(149マイクロ秒) * 14,000 = 2.086となるため、15分未満になる可能性があります。

関連する問題