【问题标题】:Read Values from .csv file and convert them to float arrays从 .csv 文件中读取值并将它们转换为浮点数组
【发布时间】:2013-01-07 17:14:00
【问题描述】:

我偶然发现了一个小编码问题。我基本上必须从一个看起来很像这样的 .csv 文件读取数据:

2011-06-19 17:29:00.000,72,44,56,0.4772,0.3286,0.8497,31.3587,0.3235,0.9147,28.5751,0.3872,0.2803,0,0.2601,0.2073,0.1172,0,0.0,0,5.8922,1,0,0,0,1.2759

现在,我基本上需要一个由这样的行组成的整个文件,并将它们解析为 numpy 数组。到现在为止,我已经能够使用类似这样的代码将它们放入一个大字符串类型对象中:

order_hist = np.loadtxt(filename_input,delimiter=',',dtype={'names': ('Year', 'Mon', 'Day', 'Stock', 'Action', 'Amount'), 'formats': ('i4', 'i4', 'i4', 'S10', 'S10', 'i4')})

到目前为止,此文件的格式由一组 S20 数据类型组成。我需要基本上将大 ORDER_HIST 数据类型中的所有数据提取到每列的一组数组中。我不知道如何保存日期时间列(我现在将其保存为字符串)。我需要将其余部分转换为浮动,但下面的代码给了我一个错误:

    temparr=float[:len(order_hist)]
    for x in range(len(order_hist['Stock'])): 
        temparr[x]=float(order_hist['Stock'][x]);

谁能告诉我如何将所有列转换为我需要的数组???或者可能会引导我到某个链接这样做?

【问题讨论】:

  • 你为什么不用csv 模块呢?
  • 我只能得到行吗?我的意思是...如何转换每一列?

标签: python arrays csv numpy data-conversion


【解决方案1】:

男孩,我有请客给你吗? numpy.genfromtxt 有一个converters 参数,它允许您在解析文件时为每一列指定一个函数。该函数被提供 CSV 字符串值。它的返回值变成了numpy数组中对应的值。

此外,dtype = None 参数告诉genfromtxt 对每列的类型进行智能猜测。特别是,数字列会自动转换为适当的 dtype。

例如,假设您的数据文件包含

2011-06-19 17:29:00.000,72,44,56

然后

import numpy as np
import datetime as DT

def make_date(datestr):
    return DT.datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S.%f')

arr = np.genfromtxt(filename, delimiter = ',',
                    converters = {'Date':make_date},
                    names =  ('Date', 'Stock', 'Action', 'Amount'),
                    dtype = None)
print(arr)
print(arr.dtype)

产量

(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56)
[('Date', '|O4'), ('Stock', '<i4'), ('Action', '<i4'), ('Amount', '<i4')]

您的真实 csv 文件有更多列,因此您希望向 names 添加更多项目,但除此之外,该示例应该仍然有效。

如果你真的不关心额外的列,你可以像这样分配一个绒毛名称:

arr = np.genfromtxt(filename, delimiter=',',
                    converters={'Date': make_date},
                    names=('Date', 'Stock', 'Action', 'Amount') +
                    tuple('col{i}'.format(i=i) for i in range(22)),
                    dtype = None)

产量

(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56, 0.4772, 0.3286, 0.8497, 31.3587, 0.3235, 0.9147, 28.5751, 0.3872, 0.2803, 0, 0.2601, 0.2073, 0.1172, 0, 0.0, 0, 5.8922, 1, 0, 0, 0, 1.2759)

您可能也有兴趣查看pandas 模块,该模块建立在numpy 之上,并且将解析CSV 提升到了更高层次:它有一个pandas.read_csv 函数,其parse_dates = True参数会自动解析日期字符串(使用dateutil)。

使用 pandas,你的 csv 可以被解析

df = pd.read_csv(filename, parse_dates = [0,1], header = None,
                    names=('Date', 'Stock', 'Action', 'Amount') +
                    tuple('col{i}'.format(i=i) for i in range(22)))

注意不需要指定make_date函数. Just to be clear --pands.read_csvreturns aDataFrame,而不是numpy数组。 DataFrame 实际上可能对您的目的更有用,但您应该意识到它是一个不同的对象,具有全新的开发和探索方法世界。

【讨论】:

  • 嘿,非常感谢这个人!!!!我只有一个后续问题。现在说我想将这些值中的一些移动到独立的数组中......我到底该怎么做?
  • 好的...我已经将数据放入...我该如何称呼它?我只是做 arr['Stock']??
  • 如果您只想解析某些列,请使用genfromtxt 中的usecols = [...] 参数。它允许您指定要在数组中使用的列名列表或列索引号。
  • 是的! arr['Stock'] 返回 Stock 列 numpy 数组。
  • 我可以使用数字来调用列吗?如果我想说跨列运行一个循环?我可以叫 arr[1] 而不是 arr['Stock'] ???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2015-06-26
  • 2021-03-17
  • 2020-02-07
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多