ValueError,虽然已经为此执行了检查

时间:2016-12-13 15:46:07

标签: python-3.x nan

对NaN数据有点困惑。此程序通过外部硬盘驱动器中的文件夹作为数据帧加载到txt文件中,并应读取最后一列的最后一个值。由于某些最后的行没有完成任何原因,我选择了之前的行(或者我希望这样做。这是代码,我已经评论了我认为给出麻烦的行:

#!/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问题,我正在使用的所有变量都应该是float数据类型,或者应该被忽略。所有数据类型应该只是字符串或浮点数,直到时间转换为整数。

1 个答案:

答案 0 :(得分:0)

好吧,即使没有人回答,我也不得不回答我自己的问题,因为我不相信我是唯一一个遇到这个问题的人。

在数据框中接收NaN有三个主要原因,其中大多数都围绕着无穷大,例如使用&#39; inf&#39;作为一个值或除以零,这也将提供NaN作为结果,维基页面对我解决此问题最有帮助: https://en.wikipedia.org/wiki/NaN

关于NaN的另一个重点是它有点像病毒,因为在任何计算中触及它的任何东西都会导致NaN,所以问题可能会成倍地恶化。实际上你正在处理的是缺少数据,直到你意识到它是什么,NaN是最不实用和令人沮丧的事情,因为它属于数据类型而不是错误,但任何数学运算都将以NaN结束。当心!!

在这种情况下的原因是因为在读取csv文件时使用了一个特定的行来获取标题,虽然这对于大多数这些文件都有效,但是其中一些文件有我在不同行上的标题,因此,导入数据框的标头要么是数据本身的一部分,要么是空值。结果,尝试通过标题名称访问数据框中的列导致NaN,并且如前所述,虽然该程序导致了一些使用变通方法来解决的问题,但其中一个实际上是可接受的,这是添加以下行:

df = df.fillna(0)

在df变量的第一个定义之后,在这种情况下:

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

最重要的是,如果你收到这个值,那么最好的办法就是弄清楚为什么你首先得到NaN,然后​​更容易做出明智的决定是否用NaN代替NaN &#39; 0&#39;是一个可行的选择。

我真诚地希望这可以帮助任何找到它的人。 问候 ■功能