2016-05-17 10 views
0

I zwei Tabellen, einer enthält SCHEDULE_DATE (über 300.000 Datensätze) und WORK_WEEK_CODE, und die zweite Tabelle enthält WORK_WEEK_CODE, START_DATE und END_DATE. Die erste Tabelle hat doppelte Termintermine und die zweite Tabelle hat 3200 eindeutige Werte. Ich muss die WORK_WEEK_CODE in Tabelle eins mit der WORK_WEEK_CODE aus Tabelle zwei bevölkern, basierend auf dem Bereich, wo das Zeitplandatum fällt. Beispiele für die zwei Tabellen sind unten.Python - Lookup-Wert aus einer Tabelle, die in einer zweiten Tabelle in einem Bereich fällt

Ich konnte die Aufgabe mit arcpy.da.UpdateCursor mit einem verschachtelten arcpy.da.SearchCursor erreichen, aber mit dem Volumen der Datensätze dauert es eine lange Zeit. Alle Vorschläge für eine bessere (und weniger zeitaufwendige) Methode würden sehr geschätzt werden.

Hinweis: Die Datumsfelder werden als String formatiert

Tabelle 1

SCHEDULE_DATE,WORK_WEEK_CODE 
20160219  
20160126  
20160219  
20160118  
20160221  
20160108  
20160129  
20160201  
20160214  
20160127 

Tabelle 2

WORK_WEEK_CODE,START_DATE,END_DATE 
1601,20160104,20160110 
1602,20160111,20160117 
1603,20160118,20160124 
1604,20160125,20160131 
1605,20160201,20160207 
1606,20160208,20160214 
1607,20160215,20160221 

Antwort

0

Sie Pandas dataframes als effizientere Methode verwenden können, . Hier ist der Ansatz mit Pandas. Hoffe, das hilft:

import pandas as pd 

    # First you need to convert your data to Pandas Dataframe I read them from csv 
    Table1 = pd.read_csv('Table1.csv') 
    Table2 = pd.read_csv('Table2.csv') 

    # Then you need to add a shared key for join 
    Table1['key'] = 1 
    Table2['key'] = 1 

    #The following line joins the two tables 
    mergeddf = pd.merge(Table1,Table2,how='left',on='key') 

    #The following line converts the string dates to actual dates 
    mergeddf['SCHEDULE_DATE'] = pd.to_datetime(mergeddf['SCHEDULE_DATE'],format='%Y%m%d') 
    mergeddf['START_DATE'] = pd.to_datetime(mergeddf['START_DATE'],format='%Y%m%d') 
    mergeddf['END_DATE'] = pd.to_datetime(mergeddf['END_DATE'],format='%Y%m%d') 

    #The following line will filter and keep only lines that you need 
    result = mergeddf[(mergeddf['SCHEDULE_DATE'] >= mergeddf['START_DATE']) & (mergeddf['SCHEDULE_DATE'] <= mergeddf['END_DATE'])]