2016-12-13 2 views
0

Немного застрял в данных NaN. Эта программа проходит через папку на внешнем жестком диске, загружая в txt-файл в виде фрейма данных, и должна считывать последнее значение последнего столбца. Поскольку некоторые из последних строк не заполняются по какой-либо причине, я решил взять строку раньше (или это то, что я надеюсь сделать. Вот код, и я прокомментировал строки, которые, как я думаю, дают проблемы:ValueError, хотя проверка уже выполнена для этого

#!/usr/bin/env python3 

import glob 
import math 
import pandas as pd 
import numpy as np 

def get_avitime(vbo): 
    try: 
     df = pd.read_csv(vbo, 
         delim_whitespace=True, 
         header=90) 
     row = next(df.iterrows()) 
     t = df.tail(2).avitime.values[0] 
     return t 
    except: 
     pass 

def human_time(seconds): 
     secs = seconds/1000 
     mins, secs = divmod(secs, 60) 
     hours, mins = divmod(mins, 60) 
     return '%02d:%02d:%02d' % (hours, mins, secs) 
def main(): 
    path = 'Z:\\VBox_Backup\\**\\*.vbo' 
    events = {} 
    customers = {} 

    for vbo_path in glob.glob(path, recursive=True): 
     path_list = vbo_path.split('\\') 
     event = path_list[2].upper() 
     customer = path_list[3].title() 
     avitime = get_avitime(vbo_path) 
     if not avitime:    # this is to check there is a number 
      continue 
     else: 
      if event not in events: 
       events[event] = {customer:avitime} 
       print(event) 
      elif customer not in events[event]: 
       events[event][last_customer] = human_time(events[event][last_customer]) 
       print(events[event][last_customer]) 
       events[event][customer] = avitime 
      else: 
       total_time = events[event][customer] 
       total_time += avitime 
       events[event][customer] = total_time 
     last_customer = customer 



    events[event][customer] = human_time(events[event][customer]) 
    df_events = pd.DataFrame(events) 
    df.to_csv('event_track_times.csv') 

main() 

Я выстроены в линию, чтобы проверить для значения, но я предполагаю, что NaN не нулевое значение, следовательно, оно не совсем сработало.

C:\Users\rob.kinsey\AppData\Local\Continuum\Anaconda3) c:\Users\rob.kinsey\Pro 
ramming>python test_single.py 
BARCELONA 
03:52:42 
02:38:31 
03:21:02 
00:16:35 
00:59:00 
00:17:45 
01:31:42 
03:03:03 
03:16:43 
01:08:03 
01:59:54 
00:09:03 
COTA 
04:38:42 
02:42:34 
sys:1: DtypeWarning: Columns (0) have mixed types. Specify dtype option on import or set low_memory=False. 
04:01:13 
01:19:47 
03:09:31 
02:37:32 
03:37:34 
02:14:42 
04:53:01 
LAGUNA_SECA 
01:09:10 
01:34:31 
01:49:27 
03:05:34 
02:39:03 
01:48:14 
SILVERSTONE 
04:39:31 
01:52:21 
02:53:42 
02:10:44 
02:11:17 
02:37:11 
01:19:12 
04:32:21 
05:06:43 
SPA 
Traceback (most recent call last): 
    File "test_single.py", line 56, in <module> 
    main() 
    File "test_single.py", line 41, in main 
    events[event][last_customer] = human_time(events[event][last_customer]) 
    File "test_single.py", line 23, in human_time 

выход начинал правильно, за исключением ошибки sys: 1, но, по крайней мере, она продолжается, и окончательная ошибка, которая полностью закрывает программу. Как я могу пройти эту проблему NaN, все переменные, с которыми я работаю, должны быть из flo по типу данных или должны быть проигнорированы. Все типы данных должны быть только строками или float до тех пор, пока преобразование времени не будет целым числом.

+0

Это новый вопрос, который никто не видел раньше? – iFunction

ответ

0

Хорошо, хотя никто не ответил, я вынужден ответить на свой вопрос, поскольку я не уверен, что я единственный человек, у которого была эта проблема.

Существует 3 основных причины приема NaN в кадре данных, большинство из которых вращаются вокруг бесконечности, например, используя «inf» в качестве значения или деля на ноль, что также даст NaN в результате, страницу wiki был самым полезным для меня в решении этого вопроса: https://en.wikipedia.org/wiki/NaN

один важный момент о NaN это то, что работает немного, как вирус, в том, что все, что прикасается его в любом расчете приведет к NaN, поэтому проблема может оказаться экспоненциально хуже. Фактически то, с чем вы имеете дело, - это отсутствие данных, и пока вы не поймете, что это так, NaN - наименее полезная и неприятная вещь, поскольку она подпадает под тип данных, а не ошибка, но любые математические операции заканчиваются NaN. BEWARE !!

Причина в этом случае заключается в том, что для получения заголовков при чтении в CSV-файле использовалась определенная строка, и хотя это работало для большинства этих файлов, некоторые из них имели заголовки, которые я использовал на другой строке , в результате, заголовки, импортируемые в кадр данных, либо были частью самих данных, либо нулевым значением. В результате попытка доступа к столбцу в фрейме данных по заголовку привела к NaN, и, как обсуждалось ранее, это увеличилось, хотя программа вызвала несколько проблем, которые использовали обходные пути для борьбы, одна из которых была фактически приемлемой, что добавьте следующую строку:

df = df.fillna(0) 

после первого определения переменной Д.Ф., в этом случае:

df= pd.read_csv(vbo, 
       delim_whitespace=True, 
       header=90) 

Суть заключается в том, что если вы получаете это значение, то лучше всего на самом деле работать почему вы получаете NaN в первую очередь, тогда легче принять обоснованное решение относительно того, заменит ли NaN «0» на vi способный выбор.

Я искренне надеюсь, что это поможет любому, кто его найдет. С уважением iFunction