2017-09-13 33 views
1

我不完全肯定詢問或說出這個問題的最佳方式,所以我會強調我的問題,數據集,我對方法和最終目標的想法,希望它會很清楚到最後。熊貓 - 日期時間在距離行數X分鐘內

我的問題:

我公司派遣員工,將加載分派給一個員工,即使他們是在他們目前的調度。這是由於我們使用的軟件的限制。如果員工在30分鐘內收到兩次派遣,我們稱之爲雙派遣。

我們正在分析我們的調度效率,並且我遇到了一些頭痛的問題。我需要通過我們的100k行數據庫,並添加一個額外的列,將讀爲一個虛擬變量1爲正常的雙0。但是,由於我們有多個人,我們派遣和B我們的記錄不是通過派遣開始排序,我需要確定在30分鐘內向同一個人發送派遣的頻率。

數據集:

數據集是由於我們的數據倉庫組織不力,但因爲我需要這些都是我需要爲我的計算列哪些項目方面令人難以置信的巨大的。

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'] 

這已經從緩慢,僅跟蹤日期倒退許多問題,而不是前鋒,所以我會丟失許多調度。

最終目標:

我的目標是有一個數據集的話,我可以通過增加一列上讀取爲虛擬變量,所以我可以過濾和計算上插回的Tableau爲我的報告。

我很感激你的時間和幫助,讓我知道是否有任何更多的細節是必要的。

謝謝!

------------------編輯------------- 增加了一個編輯,使問題變得清晰,因爲我沒有做到如此之早。

問題:Pandas是最好的工具,用來迭代我的數據框以查看每個日期時間分派的每個日期時間分派,是否有匹配技術名稱的記錄,並且距離此記錄不到30分鐘。

如果是這樣,我怎麼能改進我的算法或理論,如果不是最好的工具是什麼。

Desired Output - 所需輸出 - 一個附加列,用於記錄30分鐘窗口內發生的分派是否爲False的True 0的虛擬變量1。我需要查看何時發生雙重調度,以及有多少記錄是真正的雙派調度,而不僅僅是一個計數,指出有100個雙調度實例,但涉及200多條記錄。我需要能夠對每條記錄進行排序和查看。

+0

看不到問題。你在尋找算法的幫助嗎?或者一個特定的編碼問題?您是否試圖實施*日期前進*解決方案?它是否必須是熊貓解決方案? – wwii

+0

請解釋您希望輸出對於給定的樣本輸入。比如說,如果你有100次派發給同一個人,每隔一分鐘,你是否希望所有人都被歸類爲第一個人的「雙打」,因爲每個人都在30分鐘之內,即使最後一個人從第一個30分鐘以上? – BrenBarn

+0

@wwii我添加了一個可以同時回答的編輯。謝謝。 –

回答

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()