Я анализирую набор данных в формате * .csv, используя Python 2.7.14 и Pandas. Я заинтересован в проведении статистического анализа длительности времени на основе группировки по некоторому атрибуту. Проблема в том, что всякий раз, когда я пытаюсь сгруппировать и применить медиану, я получаю ошибку
TypeError: invalid literal for float(): 00:00:11
Длительность указана в виде строки, формат ЧЧ: ММ: СС. Я пытался преобразовать в timedelta или datetime, но каждый раз появляется ошибка.
Мне удалось найти первую строку, выдавшую ошибку в файле csv, изменить значение длительности и заметить, что выброшенная ошибка обновляется соответствующим образом (т.е. 00:00:11 становится тем, что я написал). Ошибка была несколько тысяч строк в исходном CSV. Удаление строки привело к тому, что ошибка переместилась на другую строку, а не на ту, которая была ниже удаленной.
Я застрял: я не могу выполнить автоматический анализ и не могу найти обходной путь, чтобы идентифицировать плохие линии и удалить их.
Я провел некоторое исследование и выяснил, что это обычная тема, но каждое предоставленное решение относится только к одной проблеме, и ни одно из них не соответствует моим потребностям.
Вот последний код, к которому я пришел:
импорт панд
импорт numpy
df = pandas.read_csv('log.csv',sep=",", quotechar="\"", names=["attrA","attrB","attrC","attrD","attrE","attrF","attrG","skip1","attrH","attrI","attrJ","attrL","attrM","attrN","attrO","attrP","attrQ","Duration","User","Host"], encoding="utf-8-sig")
group_host = df.groupby('Host')
for host, value in group_host['Duration']:
print((host, value.median()))
Вот пример набора данных (разумные данные были скрыты):
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:03:10","userA","hostA"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:00:34","userA","hostB"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:00:54","userA","hostA"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:02:30","userA","hostB"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:03:04","userA","hostA"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:00:44","userA","hostA"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:01:09","userA","hostB"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:00:42","userA","hostA"
"xxx","xxx","xxx","xxx","xxx","xxx","xxx","","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","00:00:11","userA","hostB"
1) как я могу очистить входные данные?
1a) Я безуспешно пытался добавить df.dropna(subset=['Duration'])
и / или pandas.to_timedelta(df.Duration,errors='coerce')
.
2) в качестве альтернативы, как я могу вручную идентифицировать линии и удалить их?
Примечание: набор данных был агрегирован из нескольких разных файлов с использованием автоматического сценария. Плохие строки не находятся ни в начале, ни в конце файлов.