python - 无法将时间序列数据读入 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 完全陌生,而且我已经尝试解决这个问题好几天了。如果您有任何问题,请随时提出,我将编辑帖子。
解决方案
评论很容易,完整的答案就是您在@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
我希望这回答了你的问题。随时问我任何问题。祝你好运!
推荐阅读
- android - 如何将位图保存到 KOTLIN 中的存储(Media.insertImage ==> insertImage 在 Java 中已弃用,Media.DATA ==> DATA 在 Java 中已弃用)
- javascript - 如何让 chrome 存储保存在 chrome 扩展弹出关闭
- mongodb - MongoDB中对话的一对一和群聊查询
- selenium-webdriver - 如何使用硒获取div下的所有元素计数
- lit-element - lit-element 绑定到可能为 null 或其子属性可能为 null 的对象的属性
- javascript - 如何使来自一个源的事件在后台呈现
- sql - 为自引用表设置一对多关系
- ios - ForEach NavigationLink 与状态和绑定
- for-loop - 有没有办法用 char 变量创建一个 for 循环来创建多个绘图?
- python - 如何同时修改两个相互关联的列表?