簡體   English   中英

通過日期時間列中的部分匹配合並 Pandas DataFrames

[英]Merge pandas DataFrames by partial match in datetime column

你好,stackoverflow 的好人。 我不能完全掌握這里的解決方案,所以請幫助我。 請記住,我是 Python 的初學者,所以請盡可能簡單。

我公司為員工提供上下班交通。 有一個系統可以跟蹤員工何時上公共汽車以及該人上哪輛公共汽車。 我們還從運輸公司接收數據,其中包含員工按照計划應該去的地點和時間的信息(每個員工都提前預訂了地點)。 有時人們不預訂地點,有時他們上錯了公共汽車(不是他們預訂的路線)或在錯誤的時間。 我的目標是找到這樣的人並提供報告。

這是我們從運輸公司收到的數據樣本

IDs     DepartureTime               Destination
13519   2019-12-15 16:15:00.000000  100 DefaultCity
10977   2019-12-15 16:15:00.000000  200 DefaultCity_2
13329   2019-12-15 16:15:00.000000  300 DefaultCity_3
14597   2019-12-16 16:15:00.000000  200 DefaultCity_2
16899   2019-12-16 16:15:00.000000  400 DefaultCity_4
14616   2019-12-16 16:15:00.000000  300 DefaultCity_3
12519   2019-12-17 16:15:00.000000  800 DefaultCity_8
11347   2019-12-17 16:15:00.000000  200 DefaultCity_2

這是我們從跟蹤系統收到的事實數據樣本

EmployeeID     DepartureTime                Destination
3027199        2019-12-15 16:12:53.000000   800 DefaultCity_8
3022569        2019-12-15 19:11:24.000000   200 DefaultCity_2
3672468        2019-12-15 16:22:46.000000   300 DefaultCity_3
3027419        2019-12-16 16:12:53.000000   800 DefaultCity_8
3045129        2019-12-16 16:11:24.000000   400 DefaultCity_4
3869438        2019-12-16 16:22:46.000000   300 DefaultCity_3
3487645        2019-12-17 16:12:53.000000   800 DefaultCity_8
3345935        2019-12-17 19:11:24.000000   200 DefaultCity_2
3235128        2019-12-17 16:22:46.000000   300 DefaultCity_3

我還有一個 SQL 表,可以幫助我將 ID 綁定到 EmployeeID

EmployeeID     name                  IDs
3027199        Alice Doe             13519  
3022569        Bob Doe               10977  
3672468        Karl Doe              13329  
3027419        Mark Doe              14597  
3045129        Jenna Doe             16899  
3869438        Victoria Doe          14616 
3487645        Vladimir Doe          12519  
3345935        Kenny Doe             11347  
3235128        Heather Doe           14403 

值得一提的是,每個工作日期都有“計划”數據,但“事實”數據沒有,因為公司只進行自發的抽查。

我做了什么:

  1. 使用 pyjanitor+pandas 和 df.filter_date 函數過濾特定日期范圍內的“計划數據”和“事實”
  2. 合並姓名、ID 和員工 ID

我正在努力做的事情:

  1. 將“計划”與“事實”合並,但不包括“計划”中存在但“事實”中不存在的日期
  2. 實際上通過“計划數據”和“事實”數據之間的時間/目的地不匹配來找到人員。請注意,在比較“計划”和“事實”數據時,我想考慮時間范圍,比如 16:01 - 16:29 為 16:15 "並且只顯示在不同時間上車的人。
  3. 查找根本沒有預訂的人。 在“計划”中根本沒有關於它們的數據,但在“事實”中會有

預期輸出

我很樂意為您提供任何可能有幫助的其他信息。 先感謝您。

您可以執行以下操作。

在下面的代碼中,第一個 df 命名為df_booking ,第二個 df 命名為df_actual ,SQL 數據庫命名為df_info

df_booking.rename(columns={'DepartureTime':'DepartureTime_booking', 'Destination':'Destination_booking'}, inplace=True)
df_booking = df_booking.merge(df_info, on='IDs')

df_actual.rename(columns={'DepartureTime':'DepartureTime_actual', 'Destination':'Destination_actual'}, inplace=True)
df_actual = df_actual.merge(df_info, on='EmployeeID')

df_anomoly = df_actual.merge(df_booking, on='EmployeeID', how = 'inner',suffixes=('', '_y') )
df_anomoly['diff_dest'] = np.where(df_anomoly['Destination_actual'].str.extract('(\d+)')!=df_anomoly['Destination_booking'].str.extract('(\d+)'),'Yes','No')
df_anomoly['diff_time']=np.where(pd.to_datetime(df_anomoly['DepartureTime_actual']).dt.floor("30min")!=pd.to_datetime(df_anomoly['DepartureTime_booking']).dt.floor("30min"),'Yes','No')
df_anomoly.drop(list(df_anomoly.filter(regex='_y$')), axis=1, inplace=True)
df_anomoly
print(df_anomoly)

輸出

EmployeeID  DepartureTime_actual    Destination_actual  name    IDs     DepartureTime_booking   Destination_booking     diff_dest   diff_time
0   3027199     12/15/2019 16:12    800 DefaultCity_8   Alice Doe   13519   12/15/2019 16:15    100 DefaultCity     Yes     No
1   3022569     12/15/2019 19:11    200 DefaultCity_2   Bob Doe     10977   12/15/2019 16:15    200 DefaultCity_2   No  Yes
2   3672468     12/15/2019 16:22    300 DefaultCity_3   Karl Doe    13329   12/15/2019 16:15    300 DefaultCity_3   No  No
3   3027419     12/16/2019 16:12    800 DefaultCity_8   Mark Doe    14597   12/16/2019 16:15    200 DefaultCity_2   Yes     No
4   3045129     12/16/2019 16:11    400 DefaultCity_4   Jenna Doe   16899   12/16/2019 16:15    400 DefaultCity_4   No  No
5   3869438     12/16/2019 16:22    300 DefaultCity_3   Victoria Doe    14616   12/16/2019 16:15    300 DefaultCity_3   No  No
6   3487645     12/17/2019 16:12    800 DefaultCity_8   Vladimir Doe    12519   12/17/2019 16:15    800 DefaultCity_8   No  No
7   3345935     12/17/2019 19:11    200 DefaultCity_2   Kenny Doe   11347   12/17/2019 16:15    200 DefaultCity_2   No  Yes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM