2017-09-13 6 views
1

私はこの質問を尋ねる最善の方法ではないので、私は自分の問題、データセット、方法と最終目標についての私の考えを強調し、うまくいけば終わりまで。パンダ - 行内のX分以内の日付時間

私の問題:

私の会社は労働者を派遣し、彼らは彼らの現在の派遣上にある場合でも、単一の従業員にディスパッチをロードします。これは、私たちが使用するソフトウェアの制限によるものです。従業員が30分以内に2回のディスパッチを受けた場合、これをダブルディスパッチと呼びます。

私たちはディスパッチの効率を分析しています。私は頭のスクラッチャーに就いています。 100kの行データベースを実行し、通常のdouble 0のダミー変数1として読み取る追加の列を追加する必要があります。しかし私たちが派遣する複数の人がいて、私たちの記録は派遣によって発注されないので、30分以内に同じ人に派遣される頻度を決定する必要があります。

データセット:

データセットが原因我々のデータウェアハウスの貧しい組織に私は、これらは私が私のcalcのために必要となる列です必要なもの項目の条件については、信じられないほど巨大です。

Tech Name   | Dispatch Time (PST) 
John Smith  | 1/1/2017 12:34 
Jane Smith  | 1/1/2017 12:46 
John Smith  | 1/1/2017 18:32 
John Smith  | 1/1/2017 18:50 

私の考え:私はそれを行うだろうか は不格好であり、それは後方一つの方法を動作しますが、できませんでした。これが唯一の後方に行く日を追跡、遅いことから、多くの問題を抱えているといない転送ので、私は多くの派遣を失われます

import pandas as pd 

df = pd.read_excel('data.xlsx') 
df.sort('Dispatch Time (PST)', inplace = True) 

tech_name = None 
dispatch_time = pd.to_datetime('1/1/1900 00:00:00') 

for index, row in df.iterrows(): 
    if tech_name is None: 
     tech_name = row['Tech Name'] 
    else: 
     if dispatch_time.pd.time_delta('0 Days 00:30:00') > row['Tech Dispatch Time (PST)'] AND row['Tech Name'] = tech_name: 
      row['Double Dispatch'] = 1 
      dispatch_time = row['Tech Dispatch Time (PST)'] 
     else: 
      dispatch_time = row['Tech Dispatch Time (PST)'] 
      tech_name = row['Tech Name'] 

:として私は、多かれ少なかれ、私のコードを記述します。

最終目標:

私の目標は、私はそのように私はフィルタリングし、その上で計算することができるダミー変数として読み込み、1列に追加することによって、私のレポートのために戻ってタブローに接続できるデータセットを持つことです。

私はあなたの時間と助けに感謝し、詳細が必要かどうかご連絡ください。

ありがとうございました!

------------------編集------------- 私がしなかったために質問を明確にするための編集を追加しましたそう早く

質問:Pandasは、各日時発送のそれぞれを見るためにデータフレームを繰り返し処理するのに最適なツールです。Techの名前と一致するレコードがあり、このレコードから30分以内です。

もしそうなら、アルゴリズムや理論を改善するにはどうすればいいですか?

希望出力 - ディスパッチがダミー変数として30分のウィンドウ内で発生した場合に記録する追加の列。Trueの場合は0、Falseの場合。私はダブルディスパッチが発生しているかどうか、そして実際にダブルディスパッチが何回行われたかを知る必要があります。私は各レコードを分類して見ることができる必要があります。

+0

質問は表示されません。あなたはアルゴリズムの助けを求めていますか?または特定のコーディングの問題? * dates going forwards *ソリューションを実装しようとしましたか?それはパンダの解決策でなければならないのですか? – wwii

+0

あなたの与えられたサンプル入力の出力を何にしたいか説明してください。たとえば、100人のディスパッチを同じ人に分けて、1分おきにした場合、最後のパーティーがあるにもかかわらず、すべてが別のものの30分以内にあるため、最初のものの「ダブルス」として分類されることを望みますか?最初から30分以上? – BrenBarn

+0

@wwii私は両方に答える編集を追加しました。ありがとうございました。 –

答えて

1

こんにちは私は解決策を見つけたと思う。遅いですが、前または後の1つのインデックスのみを比較しますが、30分以内に3回のディスパッチがあった場合、これは0.5%未満です。

import pandas as pd 
import numpy as np 
import datetime as dt 

dispatch = 'Tech Dispatched Date-Time (PST)' 
tech = 'CombinedTech' 
df = pd.read_excel('combined_data.xlsx') 
df.sort_values(dispatch, inplace=True) 
df.reset_index(inplace = True) 
df['Double Dispatch'] = np.NaN 

writer = pd.ExcelWriter('final_output.xlsx', engine='xlsxwriter') 

dispatch_count = 0 
time = dt.timedelta(minutes = 30) 

for index, row in df.iterrows(): 
    try: 
     tech_one = df[tech].loc[(index - 1)] 
     dispatch_one = df[dispatch].loc[(index - 1)] 
    except KeyError: 
     tech_one = None 
     dispatch_one = pd.to_datetime('1/1/1990 00:00:00') 
    try: 
     tech_two = df[tech].loc[(index + 1)] 
     dispatch_two = df[dispatch].loc[(index + 1)] 
    except KeyError: 
     tech_two = None 
     dispatch_two = pd.to_datetime('1/1/2020 00:00:00') 
    first_time = dispatch_one + time 
    second_time = pd.to_datetime(row[dispatch]) + time 
    dispatch_pd = pd.to_datetime(row[dispatch]) 
    if tech_one == row[tech] or tech_two == row[tech]: 
     if first_time > row[dispatch] or second_time > dispatch_two: 
      df.set_value(index, 'Double Dispatch', 1) 
      dispatch_count += 1 
     else: 
      df.set_value(index, 'Double Dispatch', 0) 
      dispatch_count += 1 
    print(dispatch_count) # This was to monitor total # of records being pushed through 

df.to_excel(writer,sheet_name='Sheet1') 
writer.save() 
writer.close() 
関連する問題