我有一个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而不是整数。
提前谢谢!
答案 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