对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数据类型,或者应该被忽略。所有数据类型应该只是字符串或浮点数,直到时间转换为整数。
答案 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;是一个可行的选择。
我真诚地希望这可以帮助任何找到它的人。 问候 ■功能