【发布时间】:2020-01-09 14:01:18
【问题描述】:
我有以下非结构化数据(从 csv 读取)。
data = [[b'id' b'datetime' b'anomaly_length' b'affected_sensors' b'reason']
[b'1' b'2019-12-20 08:09' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:10' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:11' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:12' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:13' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:14' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:15' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:16' b'26' b'all' b'Open Windows']
[b'1' b'2019-12-20 08:17' b'26' b'all' b'Open Windows']]
...
我目前使用以下代码创建结构化数组:
labels_id = np.array(data[1:,0], dtype=int)
labels = [dt.datetime.strptime(date.decode("utf-8"), '%Y-%m-%d %H:%M') for date in np.array(data[1:,1])]
labels_length = np.array(data[1:,2], dtype=int)
此代码是必需的,因为我需要具有正确数据类型的数据。在函数中,我传递所有数组并通过索引访问它们。我不喜欢这个解决方案,但因为函数被多次调用,我不想每次都将数据强制转换到函数中。
原点功能码:
def special_find(labels_id, labels, labels_length):
for i, id in enumerate(labels_id):
print(id)
print(labels[i])
print(labels_length[i])
...
预期:我想要一个仅包含所需列的结构化数组:
structured_data = [[1 datetime.datetime(2019, 12, 20, 8, 9) b'2019-12-20 08:09' 26],
[1 datetime.datetime(2019, 12, 20, 8, 10) 26],
[1 datetime.datetime(2019, 12, 20, 8, 11) 26],
[1 datetime.datetime(2019, 12, 20, 8, 12) 26],
[1 datetime.datetime(2019, 12, 20, 8, 13) 26],
[1 datetime.datetime(2019, 12, 20, 8, 14) 26],
...
我知道我可以连接所有创建的数组,但我认为这不是一个好的解决方案。相反,我正在寻找这样的东西:
structured_data = np.array(data[1:, 0:3], dtype=...)
更新:这里是 csv 文件的一些值
id,datetime,anomaly_length,affected_sensors,reason
1,2019-12-20 08:09,26,all,Open Windows
1,2019-12-20 08:10,26,all,Open Windows
1,2019-12-20 08:11,26,all,Open Windows
1,2019-12-20 08:12,26,all,Open Windows
1,2019-12-20 08:13,26,all,Open Windows
1,2019-12-20 08:14,26,all,Open Windows
1,2019-12-20 08:15,26,all,Open Windows
1,2019-12-20 08:16,26,all,Open Windows
1,2019-12-20 08:17,26,all,Open Windows
【问题讨论】:
-
使用熊猫。当您的数据并非全部属于同一类型时,NumPy 就会失去很多用处。
-
@Seb 你能给我一个代码示例吗?
-
读取 csv 时获取结构化数组可能更容易。您可以指定
dtype=None或您自己的dtype -
pandasread_csv功能强大且速度快。您可以使用“to_records”从数据框中获取结构化数组。无论如何处理该日期/时间列可能会很棘手,因为可能的类型包括字符串、datetime对象和np.datetime64。 -
我会支持 @Seb 的建议,使用 Pandas。你能分享至少部分数据吗?请参阅:minimal reproducible example。
标签: python numpy structured-array