python char替换readfile

时间:2016-11-01 21:54:41

标签: python numpy

我有一个text / csv文件,其中包含以下内容。它有800万条或更多的记录

1, 10721, 12478, 5, 0, 0, 0,"A1","0555"
1, 10722, 12479, 1, 0, 0, 0,"A2","1555"

其中前7列是整数,然后第7和第8列引用"焦炭。我希望将第8列读为整数,因为它是一天中的时间。

我的问题:我如何删除这个" char并将此列用作整数而不是字符串,同时将计算/ ram保持为最小。

目前我正在使用numpy.genfromtxt。我注意到dtype是一个选项,但是如果我给最后一列提供整数,它只是将它转换为-1而不是整数。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

我想到的一件事(并且请小心谨慎,因为我知道几乎没有关于NumPy)将为第8列创建自己的转换器(首先是零):

假设您将数据放在一个文件中...... eeeermmm ...名为stack_063.csv。你可以这样做:

data = numpy.genfromtxt("stack_063.csv", dtype=int, delimiter=',',
                        converters={
                            8: lambda x: float(x.replace('"', '')) / 100
                        })
print(data)

这样,您就会得到如下列表:

[(1, 10721, 12478, 5, 0, 0, 0, -1, 5.55)
 (1, 10722, 12479, 1, 0, 0, 0, -1, 15.55)]

如果你想要一个int,只需让你的转换器为:lambda x: int(x.replace('"', ''))

编辑

与NumPY多玩一点,我看到你可以做的另一件事,也许吧。这是将第8列的数据类型声明为numpy.object,然后从中获取实际的datetime.time

import numpy
import datetime

data_types = [
    numpy.uint16,
    numpy.int_,
    numpy.int_,
    numpy.int_,
    numpy.int_,
    numpy.int_,
    numpy.int_,
    numpy.dtype((str, 35)),
    numpy.object_
]
data = numpy.genfromtxt("stack_063.csv", dtype=data_types, delimiter=',',
                        converters={
                            7: lambda x: x.replace('"', ''),
                            8: lambda x: datetime.datetime.strptime(x, '"%H%M"').time()
                        })
print(data)

这给出了:

[(1, 10721, 12478, 5, 0, 0, 0, 'A1', datetime.time(5, 55))
 (1, 10722, 12479, 1, 0, 0, 0, 'A2', datetime.time(15, 55))]

然而,我真的不知道这是不是一个好主意......

答案 1 :(得分:0)

我还会考虑使用Pandas模块:

In [137]: import pandas as pd

In [138]: file_name = r'D:\temp\dt.csv'

In [139]: df = pd.read_csv(file_name, header=None, sep=',', skipinitialspace=True)

In [140]: df
Out[140]:
   0      1      2  3  4  5  6   7     8
0  1  10721  12478  5  0  0  0  A1   555
1  1  10722  12479  1  0  0  0  A2  1555

In [141]: df[8] = pd.to_datetime(df[8], format='%H%M').dt.time

In [142]: df
Out[142]:
   0      1      2  3  4  5  6   7         8
0  1  10721  12478  5  0  0  0  A1  05:55:00
1  1  10722  12479  1  0  0  0  A2  15:55:00