首页 > 解决方案 > 无法将时间序列数据读入 numpy 数组

问题描述

我一直在尝试从 .csv 文件创建时间序列数据集。

我无法解决的是它有 2 个时间索引:分别是交易日期和时间,存储在两个单独的字符串中。

尝试此操作时:

Date, Time, Open,High,Low,Close,Volume = np.loadtxt('EURUSD.txt', unpack = True,
                                delimiter = '\t',
                                converters = {0:time.strptime('%Y.%m.%d')})

我收到此错误:

ValueError: invalid literal for float(): 00:00

这让我怀疑问题是第二次索引。

数据如下所示:

2009.03.10  00:00   1.26185 1.26265 1.26185 1.2623  1344
2009.03.10  00:05   1.2623  1.26255 1.26185 1.26195 1656
2009.03.10  00:10   1.262   1.2622  1.26155 1.26175 1068

其中第一列和第二列分别是交易日期和时间。它们由制表符分隔。

我应该尝试将两者合并为一个索引吗?如果是这样,怎么做?我希望我已经充分解释了我的问题,我对 python 完全陌生,而且我已经尝试解决这个问题好几天了。如果您有任何问题,请随时提出,我将编辑帖子。

标签: pythonpython-3.xnumpy

解决方案


评论很容易,完整的答案就是您在@Trebled 上寻找的内容。

无论如何,正如@hpaulj 提到的,您的数据需要一个转换器来适当地解析日期时间列。我通常使用pandas 的 read_csv函数来执行这些类型的输入/输出操作。但在此之前,我建议在您的数据文件顶部添加一个标题(根据您的问题)。

Date    Time    Open    High    Low Close   Volume
2009.03.10  00:00   1.26185 1.26265 1.26185 1.2623  1344
2009.03.10  00:05   1.2623  1.26255 1.26185 1.26195 1656
2009.03.10  00:10   1.262   1.2622  1.26155 1.26175 1068

读取这个文件很简单,如下调用:

from datetime import datetime # for parsing the Date and Time columns
import pandas as pd # for reading the data file

converters_ = {
    "Date": lambda value: datetime.strptime(value, "%Y.%m.%d").date(),
    "Time": lambda value: datetime.strptime(value, "%H:%M").time()
}

data = pd.read_csv('{file_name_goes_here}', sep='\t', header = 0, converters=converters_, dtype="float")

如您所见,导入用于适当的函数调用。然后,定义一个字典,其中包含数据的日期和时间列的转换器。在这种情况下,转换器是lambda 函数,它获取指定列的第 i 个值并通过strptime将其转换为相应的 datetime 对象。此函数接收值和特定格式作为参数。最后,使用带有必要参数分隔符(选项卡)、标题(第一行包含每列的键)、转换器和 dtype(设置为 float 以将所有其他列值转换为浮点数字)。

调用数据会输出:

>>> data
         Date      Time     Open     High      Low    Close  Volume
0  2009-03-10  00:00:00  1.26185  1.26265  1.26185  1.26230    1344
1  2009-03-10  00:05:00  1.26230  1.26255  1.26185  1.26195    1656
2  2009-03-10  00:10:00  1.26200  1.26220  1.26155  1.26175    1068

如果您需要获取特定列的值,请调用data['{key}']。例如,调用data['Volume']将输出:

>>> data['Volume']
0    1344
1    1656
2    1068
Name: Volume, dtype: int64

如果您甚至需要将数据作为 numpy 数组,请调用data['{key}'].values例如,调用data['Volume']将输出:

>>> data['Volume'].values
array([1344, 1656, 1068])

最后,如果您想将日期和时间列作为一列读取:

from datetime import datetime # for parsing the Date and Time columns
import pandas as pd # for reading the data file

data = pd.read_csv('data.example', sep='\t', header = 0, parse_dates=[["Date", "Time"]], dtype = float)

在这种情况下,不需要转换器,因为应该在parse_dates参数的列表中指定应该解析的列。调用数据会输出:

>>> data
            Date_Time     Open     High      Low    Close  Volume
0 2009-03-10 00:00:00  1.26185  1.26265  1.26185  1.26230    1344
1 2009-03-10 00:05:00  1.26230  1.26255  1.26185  1.26195    1656
2 2009-03-10 00:10:00  1.26200  1.26220  1.26155  1.26175    1068

我希望这回答了你的问题。随时问我任何问题。祝你好运!


推荐阅读