【问题标题】:Converting data from a csv file into numpy array issue将数据从 csv 文件转换为 numpy 数组问题
【发布时间】:2015-06-30 21:47:08
【问题描述】:

在一个 csv 文件中,我有代表特定股票的日期、开盘价、收盘价、最高价、最低价和成交量的数据。数据存储格式如下:

20150601 000000;1.094990;1.095010;1.094990;1.094990;0

我正在尝试使用以下代码将日期提取到一个 numpy 数组中,以便我可以使用算法分析数据。但是,在转换日期时,我没有得到正确的日期。

谁能指出我正在犯的错误?

datefunc = lambda x: mdates.date2num(datetime.strptime(x, '%y%m%d%H%M %f'))
date,high,low,open,close,volume = np.loadtxt('DAT_ASCII_EURUSD_M1_201506.csv',unpack=True, 
                              delimiter=';',
                              converters={0:datefunc})

非常感谢任何帮助。

【问题讨论】:

  • 您的样品行不正确吗?还有mdates.date2num是什么?
  • 我怀疑他做过import matplotlib.dates as mdates
  • 你的日期格式也不正确
  • 正确的日期格式是什么?
  • 它将是'%Y%m%d',但您不能在同一个数组中拥有日期时间和浮点数。我认为熊猫会非常有用

标签: python csv numpy type-conversion


【解决方案1】:

您的日期格式不正确,它需要是年、月和日"%Y%m%d",您也不能有一个日期时间对象并在您的数组中浮动,但使用结构化数组可以让您拥有混合类型。

如果mdates 返回一个使用正确格式的浮点数,只要你有一个; 分隔线,它应该会再次起作用:

from datetime import datetime
import numpy as np
datefunc = lambda x: mdates.date2num(datetime.strptime(x, '%Y%m%d'))

a = np.loadtxt('in.csv', delimiter=';',
                  converters={0: datefunc})

哪个会输出:

[  7.35750000e+05   0.00000000e+00   1.09499000e+00   1.09501000e+00
1.09499000e+00   1.09499000e+00   0.00000000e+00]

您的示例输入行中有七个元素,因此解包时会出现错误,如果是拼写错误,则可以,但如果不是,则需要修复它。

如果您有混合类型,您可以使用带有 genfromtxt 的结构化数组:

from datetime import datetime
import numpy as np
datefunc = lambda x: datetime.strptime(x, '%Y%m%d')
a = np.genfromtxt('in.csv', delimiter=';',
              converters={0: datefunc}, dtype='object, float, float,float,float,float',
              names=["date", "high", "low", "open", "close", "volume"])

print(a["date"])
print(a["high"])
print(a["low"])
print(a["open"])
print(a["close"])
print(a["volume"])

2015-06-01 00:00:00
0.0
1.09499
1.09501
1.09499
1.09499

这假定您的输入实际上由 ; 分隔,并且没有像示例行中那样的空格。

【讨论】:

  • 感谢您更正我的格式并修复了混合数据类型问题。但是,当我使用这种转换方法时,出现以下错误:names=["date", "high", "low", "open", "close", "volume"]) TypeError: loadtxt() got an意外的关键字参数“名称”>>>
  • @Jerryberry123,你需要使用 genfromtxt,我的错误
  • 谢谢!然而,当年日期是格式化的,然后是空间,然后是毫秒值{20150601 000000; 1.094990; 1.094990; 1.094990; 1.094990; 1.094990; 1.094920; 1.094990; 0} {20150601 000100; 0} {20150601 000200; 0} {2015490; 1.09490; 1.094940 ;1.095060;1.094890;1.095050;0} {20150601 000300;1.095090;1.095130;1.095050;1.095060;0}
  • 嗯,现在一切都说得通了,改成'%Y%m%d %f'
  • 感谢大家现在的工作。虽然数据表示为 datetime.datetime(2015, 6, 1, 0, 0, 0, 100)。应该是那个格式还是2015-06-01 000000格式?
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2017-11-02
  • 2017-01-15
  • 2017-02-13
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多