2016-05-23 3 views
0

В настоящее время я беру курс анализа данных на Udacity. Мне немного тяжело. Я в настоящее время пытаюсь преобразовать некоторые типы данных в некоторые словари, и я продолжаю получать ошибку «TypeError: индексы списка должны быть целыми, а не str». Теперь, это говорит, что это список, но из моего понимания все мои данные находятся в Словарь. Вот код.«TypeError: индексы индексов должны быть целыми, а не str» в 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] 

Вот пример содержимого файла, то первые две строк:

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

Последняя строка 'openCSV' преобразует ваши данные в список, не так ли? Попробуйте просто вернуть 'reader' –

+0

Я думал, что строка' reader = unicodecsv.DictReader (f) 'преобразует данные в словарь. В основном потому, что вы не можете получить доступ к элементу в списке со строкой. @SimonFraser –

+0

в вашем цикле for, вы получаете регистрацию, итерации по зачислению, но вы пытаетесь получить доступ к ключам для обработки, а не к ключам регистрации. –

ответ

2

в вашем цикл, вы получаете регистрацию итерации на учащихся, но вы пытаетесь получить доступ, что процесс регистрации клавиши вместо клавиш охвата

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

Кроме того, ваши вспомогательные функции могут быть упрощены:

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

Итак, я изменил его, чтобы он вернул словарь вместо списка и использовал приведенный выше код. Однако я получаю новую ошибку. ValueError: элемент последовательности обновления словаря # 0 имеет длину 7; 2 требуется –

+0

не изменяйте, как вы создали записи, просто удалите «s», как я сделал –

+0

Я тоже пробовал это, он дает мне ту же ошибку, с которой я начинал, индексы TypeError: list должны быть целыми, а не str. –

-1

У вас есть опечатка. Он должен быть enrolment['cancel_date'] не enrolments['cancel_date']