2016-12-13 5 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で、したがって、それは非常に働いていない、NULL値ではないことを推測しています。

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の問題をどのようにして回避できますか?データ型であるか、または無視されているはずです。すべてのデータ型は、時間変換が整数になるまで文字列または浮動小数点でなければなりません。

+0

これは誰も以前見たことのない新しい問題ですか? – iFunction

答えて

0

誰も答えなかったとしても、私は自分自身の疑問に答えるように強制されています。私はこの問題を抱えている唯一の人だと確信していません。

データフレーム内でNaNを受け取る主な理由は3つあります。これらのほとんどは無限大を中心にしています。たとえば、値として「inf」を使用したり、0で割ったりすると、結果としてNaNが得られます。この問題の解決に私のために最も有用だった:NaNのそれについて https://en.wikipedia.org/wiki/NaN

もう1つの重要なポイントはNaNになります任意の計算で、それに触れることは何もして、ウイルスのような動作をしますので、問題は指数関数的に悪化する可能性があります。あなたが扱っているのはデータが欠落していることです。それが実現するまで、NaNはエラーではなくデータ型になりますが、NaNでは数学演算は終了しません。注意してください!

この理由は、csvファイルを読み込むときにヘッダーを取得するために特定の行が使用されたためです。これらのファイルの大部分で機能していましたが、一部のヘッダーは別の行その結果、データフレームにインポートされるヘッダーは、データ自体の一部であるか、またはヌル値のいずれかでした。その結果、ヘッダー名でデータフレームの列にアクセスしようとするとNaNが発生し、先に説明したように、このプログラムは、回避策を使用したいくつかの問題を引き起こしましたが、その1つは実際にはこの場合には、DF変数の最初の定義の後

df = df.fillna(0) 

:この行を追加します

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

一番下の行は、あなたがこの値を受信して​​いる場合、最善のことは、実際に動作するということですなぜあなたが最初にNaNを取得しているのかを知るためには、NaNを '0'に置き換えるかどうかに関する情報に基づいた決定をvi可能な選択。

私はこれが欲しいと願っています。 よろしくお願いいたします。 iFunction

関連する問題