如何从csvfile读取Nan列到python,以便可以使用数据?

时间:2019-07-20 05:16:07

标签: python pandas csv hex nan

我正在尝试从csvfile读取数据列,然后使用它进行一些计算。问题是我的时间戳是十六进制的。我需要读入它们并转换为十进制,但除了Nan之外,我不知道如何将其转换为python。

我尝试先将其设置为字符串。

colnames = [ 'sensor', 'x', 'y', 'z', 'azimuth', 'elevation', 'roll', 'timestamp']

data = pd.read_csv('The Project- 7-19 SS Arc Test.csv', names = colnames)

hexa_time_initial = data.timestamp.tolist() 

它必须是十六进制的列表,但仅仅是nan的列表。当它尝试运行转换循环时,出现错误,它无法使用显式基数转换非字符串。

Sample of excel file

1, 0.614, -7.798, -1.465, -6.117, 3.050, 5.231,0x42ef4, 1, 0.615, -7.798, -1.465, -6.109, 3.049, 5.231,0x42f05, 1, 0.616, -7.798, -1.465, -6.097, 3.045, 5.232,0x42f15, 1, 0.615, -7.798, -1.465, -6.108, 3.048, 5.232,0x42f26, 1, 0.614, -7.798, -1.465, -6.121, 3.051, 5.230,0x42f37, 1, 0.615, -7.798, -1.465, -6.107, 3.048, 5.230,0x42f47, 1, 0.616, -7.798, -1.465, -6.100, 3.046, 5.230,0x42f58, 1, 0.614, -7.798, -1.465, -6.116, 3.049, 5.230,0x42f69,

1 个答案:

答案 0 :(得分:0)

感谢您提供示例数据。我在这里发布消息,不是因为我确定找到了解决方案,而是因为我无法在注释中显示输出。但我有一个建议,可能会有所帮助。

当您阅读帖子中显示的csv数据时,我得到以下输出:

   sensor      x      y      z  azimuth  elevation     roll  timestamp
1   0.614 -7.798 -1.465 -6.117    3.050      5.231  0x42ef4        NaN
1   0.615 -7.798 -1.465 -6.109    3.049      5.231  0x42f05        NaN
1   0.616 -7.798 -1.465 -6.097    3.045      5.232  0x42f15        NaN
1   0.615 -7.798 -1.465 -6.108    3.048      5.232  0x42f26        NaN
1   0.614 -7.798 -1.465 -6.121    3.051      5.230  0x42f37        NaN
1   0.615 -7.798 -1.465 -6.107    3.048      5.230  0x42f47        NaN
1   0.616 -7.798 -1.465 -6.100    3.046      5.230  0x42f58        NaN
1   0.614 -7.798 -1.465 -6.116    3.049      5.230  0x42f69        NaN

我认识到timestamp列是NaN,但是sensor列也不是第一列。我认为这是因为从excel创建的csv行以逗号结尾。然后,Pandas好像在末尾有一个(空)额外的列。而且,由于您的名字中还有一列,因此似乎在第一列中创建了一个索引。然后,这还会使列名移位一。这种行为对我来说似乎很奇怪,但也是可以预期的。可以肯定的是,我刚刚创建了bug ticket for this, to be sure。您使用的是哪个版本的熊猫?

如果只是稍微更改阅读代码,则可以避免这种情况:

df= pd.read_csv(io.StringIO(raw), sep=',\s*', names=colnames, index_col=False)

这样阅读df之后,看起来会更好:

   sensor      x      y      z  azimuth  elevation   roll timestamp
0       1  0.614 -7.798 -1.465   -6.117      3.050  5.231   0x42ef4
1       1  0.615 -7.798 -1.465   -6.109      3.049  5.231   0x42f05
2       1  0.616 -7.798 -1.465   -6.097      3.045  5.232   0x42f15
3       1  0.615 -7.798 -1.465   -6.108      3.048  5.232   0x42f26
4       1  0.614 -7.798 -1.465   -6.121      3.051  5.230   0x42f37
5       1  0.615 -7.798 -1.465   -6.107      3.048  5.230   0x42f47
6       1  0.616 -7.798 -1.465   -6.100      3.046  5.230   0x42f58
7       1  0.614 -7.798 -1.465   -6.116      3.049  5.230   0x42f69

现在,已正确分配列名。这是因为有index_col=False选项,该选项告诉熊猫不要将文件的第一列用作索引。

如果愿意,还可以添加类似usecols=range(len(colnames))的名称来告诉熊猫,它应该只使用文件中具有名称的列,因此,如果excel运行amok并在该处添加数十个逗号,最后,由于数据帧中有许多空列和未命名列,因此不会出现问题。 您应该检查您是否真的想使用sep=',\s*'或更确切地说是sep=','。第一个只是确保您删除第1列的值之前的前导空格...