2016-05-23 20 views
0

Ich bin gerade dabei, einen Datenanalysekurs über Udacity zu machen. Ich habe ein bisschen harte Zeit. Ich habe im Moment versucht, einige Datentypen in einigen Wörterbüchern zu konvertieren, und ich bekomme immer den Fehler "TypeError: Liste Indizes müssen ganze Zahlen, nicht str sein" Jetzt heißt es, es ist eine Liste, aber aus meinem Verständnis sind alle meine Daten in a Wörterbuch. Hier ist der Code."TypeError: List-Indizes müssen Integer sein, nicht str" in Python 2.7

# Lesson 1 - Data Analysis 
# Get & Open Data 
import unicodecsv 
import datetime as dt 

def openCSV(filename): 
    with open(filename, "rb") as f: 
     reader = unicodecsv.DictReader(f) 
     return list(reader) 

def parse_date(date): 
    if date == '': 
     return None 
    else: 
     return dt.strptime(date, "%y-%m-%d") 
def parse_int(i): 
    if i == '': 
     return None 
    else: 
     return int(i) 

enrollments = openCSV("enrollments.csv") 

for enrollment in enrollments: 
    enrollments['cancel_date'] = parse_date(enrollments['cancel_date']) 
    enrollments['days_to_cancel'] = parse_int(enrollments['days_to_cancel']) 
    enrollments['is_canceled'] = enrollments['is_canceled'] == 'True' 
    enrollments['is_udacity'] = enrollments['is_udacity'] == 'True' 
    enrollments['join_date'] = parse_date(enrollments['join_date']) 

# daily_engagement = openCSV("daily_engagement.csv") 
# project_submissions = openCSV("project_submissions.csv") 

enrollments[0] 

Hier ist ein Beispiel des Inhalts der Datei, es die ersten beiden Reihen sind:

account_key,status,join_date,cancel_date,days_to_cancel,is_udacity,is_canceled 
448,canceled,2014-11-10,2015-01-14,65,True,True 
+0

Die letzte Zeile von 'openCSV' konvertiert Ihre Daten in eine Liste, nicht wahr? Versuchen Sie, nur 'Leser' zurück zu geben. –

+0

Ich dachte, die Zeile' reader = unicodecsv.DictReader (f) 'konvertiert die Daten in ein Wörterbuch. Hauptsächlich weil Sie nicht auf ein Element in einer Liste mit einer Zeichenfolge zugreifen können. @SimonFraser –

+0

In Ihrer for-Schleife erhalten Sie die Registrierung durch Iteration von Registrierungen, aber Sie versuchen, auf Enrolements-Schlüssel statt Enrollment-Schlüssel zuzugreifen –

Antwort

2

in Ihrer for-Schleife, Sie Einschreibung erhalten, indem auf Einschreibungen Iterieren, aber Sie versuchen Einschreibungen zugreifen Tasten statt Einschreibung Tasten

for enrollment in enrollments: 
    enrollment['cancel_date'] = parse_date(enrollment['cancel_date']) 
    enrollment['days_to_cancel'] = parse_int(enrollment['days_to_cancel']) 
    enrollment['is_canceled'] = enrollment['is_canceled'] == 'True' 
    enrollment['is_udacity'] = enrollment['is_udacity'] == 'True' 
    enrollment['join_date'] = parse_date(enrollment['join_date']) 

auch können Ihre Hilfsfunktionen vereinfacht werden:

def parse_date(date): 
    return dt.strptime(date, "%y-%m-%d") if date else None 

def parse_int(i): 
    return int(i) if i else None 
+0

Also änderte ich es, so dass es ein Wörterbuch anstelle einer Liste zurückgab und den obigen Code verwendete. Ich bekomme jedoch einen neuen Fehler. ValueError: Wörterbuchaktualisierungssequenzelement # 0 hat Länge 7; 2 ist erforderlich –

+0

nicht ändern, wie Sie Anmeldungen erstellt, nur entfernen Sie das "s", wie ich –

+0

Ich habe versucht, auch, es gibt mir den gleichen Fehler, mit dem ich begann, TypeError: Liste Indizes müssen Ganzzahlen sein, nicht str. –

-1

Sie haben einen Tippfehler. Es sollte enrolment['cancel_date'] nicht

Verwandte Themen