我正在尝试绘制这种csv格式的东西:timestamp,value。但这些值不是实数,而是大值的缩写(k = 1000,M = 1000000等)。
2012-02-24 09:07:01, 8.1M
2012-02-24 09:07:02, 64.8M
2012-02-24 09:07:03, 84.8M
2012-02-24 09:07:04, 84.8M
2012-02-24 09:07:05, 84.8M
2012-02-24 09:07:07, 84.8M
2012-02-24 09:07:08, 84.8M
2012-02-24 09:07:09, 84.8M
2012-02-24 09:07:10, 84.8M
我通常使用numpy记录数组来使用matplotlib.mlab.csv2rec(infile)
来存储csv。但只有在值不是缩写形式时才有效。有没有一种简单的方法可以做到这一点,而实际上我的程序读取每个值,寻找' M' M'将84.8M转换为84800000?
答案 0 :(得分:5)
另一种可能性是以下转换功能:
conv = dict(zip('kMGT', (3, 6, 9, 12)))
def parse_number(value):
if value[-1] in conv:
value = '{}e{}'.format(value[:-1], conv[value[-1]])
return float(value)
示例:
>>> parse_number('1337')
1337.0
>>> parse_number('8.1k')
8100.0
>>> parse_number('8.1M')
8100000.0
>>> parse_number('64.367G')
64367000000.0
答案 1 :(得分:2)
您可以在csv2rec的 convertd 参数中使用Niklas B.的功能:
>>> data = mlab.csv2rec(infile, names=['datetime', 'values'],
... convertd={'values': parse_number})
>>> data
rec.array([(datetime.datetime(2012, 2, 24, 9, 7, 1), 8100000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 2), 64800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 3), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 4), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 5), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 7), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 8), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 9), 84800000.0),
(datetime.datetime(2012, 2, 24, 9, 7, 10), 84800000.0)],
dtype=[('datetime', '|O8'), ('values', '<f8')])