2016-08-03 20 views
3

Ich möchte Daten in einem Datenrahmen identifizieren, die fortlaufend sind, dh es gibt entweder einen unmittelbaren Vorgänger oder Nachfolger. Ich möchte dann markieren, welche Daten in einer neuen Spalte stehen und nicht fortlaufend sind. Zusätzlich möchte ich diese Operation innerhalb bestimmter Teilmengen meiner Daten durchführen.So identifizieren Sie aufeinanderfolgende Daten

Zuerst erstelle ich eine neue Variable, in der ich Wahr für False für aufeinanderfolgende Tage identifizieren würde.

weatherFile['CONSECUTIVE_DAY'] = 'NA' 

Ich habe konvertierten Daten in Datetime-Objekte dann auf Ordnungs diejenigen:

weatherFile['DATE_OBJ'] = [datetime.strptime(d, '%Y%m%d') for d in weatherFile['DATE']] 
weatherFile['DATE_INT'] = list([d.toordinal() for d in weatherFile['DATE_OBJ']]) 

Jetzt würde ich aufeinanderfolgende Tage, in den folgenden Gruppen identifizieren mag:

weatherFile.groupby(['COUNTY_GEOID_YEAR', 'TEMPBIN']) 

Ich denke Durchlaufen der Gruppen und Anwenden einer Operation, die angibt, welche Tage aufeinanderfolgend sind und welche nicht, innerhalb eines eindeutigen Bezirks, tempbin-Untergruppen.

Ich bin ziemlich neu in der Programmierung und Python, ist dies ein guter Ansatz bisher, wenn ja, wie kann ich Fortschritte machen?

Danke - lassen Sie mich wissen, wenn ich zusätzliche Informationen bereitstellen sollte.

Update:

@karakfa Beratung Verwendung habe ich versucht, die folgenden: unhashable Typ:

weatherFile.groupby(['COUNTY_GEOID_YEAR', 'TEMPBIN']) 
weatherFile['DISTANCE'] = weatherFile[1:, 'DATE_INT'] - weatherFile[:-1,'DATE_INT'] 
weatherFile['CONSECUTIVE?'] = np.logical_or(np.insert((weatherFile['DISTANCE']),0,0) == 1, np.append((weatherFile['DISTANCE']),0) == 1) 

in einem Typeerror Dies führt. Traceback passiert in der zweiten Zeile. weatherFile ['DATE_INT'] ist dtype: int64.

Antwort

3

können Sie verwenden .shift (-1) oder .shift (1) aufeinander folgende Einträge vergleichen:

df.loc[df['DATE_INT'].shift(-1) - df['DATE_INT'] == 1, 'CONSECUTIVE_DAY'] = True 

Wird CONSECUTIVE_DAY auf TRUE gesetzt, wenn der vorherige Eintrag am Vortag ist

df.loc[(df['DATE_INT'].shift(-1) - df['DATE_INT'] == 1) | (df['DATE_INT'].shift(1) - df['DATE_INT'] == -1), 'CONSECUTIVE_DAY'] = True 

Wird CONSECUTIVE_DAY auf TRUE setzen, wenn dem Eintrag ein fortlaufendes Datum vorangestellt oder gefolgt wird.

+0

wow - vielen Dank. Ich habe den ganzen Tag gearbeitet, um das herauszufinden und das hat super funktioniert! Schätze es sehr. – Justin

1

Sobald Sie die Ordnungszahlen haben, ist es eine triviale Aufgabe, hier bin numpy Arrays bin mit einer Alternative vorzuschlagen

a=np.array([1,2,4,6,7,10,12,13,14,20]) 
d=a[1:]-a[:-1]           # compute delta 
ind=np.logical_or(np.insert(d,0,0)==1,np.append(d,0)==1) # at least one side matches 
a[ind]             # get matching entries 

gibt Ihnen die Zahlen, wo es eine fortlaufende Nummer ist

array([ 1, 2, 6, 7, 12, 13, 14]) 

nämlich 4, 10 und 20 werden entfernt.

+0

Danke für die Antwort - ich verstehe Ihre Lösung und bestätigt Ihr Beispiel funktioniert. Wenn ich versuche, es auf mein Szenario anzuwenden, erhalte ich einen TypeError: nicht hashbaren Typ. Ich werde meine Frage mit meinem Lösungsversuch aktualisieren, vielleicht können Sie mir helfen zu sehen, wo ich falsch gelaufen bin. – Justin

Verwandte Themen