拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 使用Python创建和排序时间戳资料的最快方法是什么?

使用Python创建和排序时间戳资料的最快方法是什么?

白鹭 - 2022-02-10 2066 0 0

可以说我将有两个阵列。第一行将指定时间戳,第二行将是资料。

timeStamp = ['0001','0002','0003',...,'9999']

data = [6234,2372,1251,...,5172]

存盘它们的最佳方式是什么?假设我想将资料从最小到更大的数字进行排序,同时保持它们的时间戳值附加到它们上面?

uj5u.com热心网友回复:

有多种方法可以做到这一点。让我们获取以下资料 -

timeStamp = [9,1,2,3,9999]
data = [1245, 6234,2372,1251,5172]

使用基础 python 和 zip

处理资料的默认方式,特别是串列。zip方法允许您按元素压缩两个或多个串列,创建一个元组串列。然后sorted您可以使用lamda 函式,该函式按元素的特定位置对组合串列进行排序。

l = zip(timeStamp, data) #storing 2 arrays by attaching them elementwise
print(sorted(l, key=lambda x: x[0]))
[(1, 6234), (2, 2372), (3, 1251), (9, 1245), (9999, 5172)]

使用 numpy 和 argsort

Numpy 允许您使用多维阵列。对于 2 个串列,您可以简单地将np.stack它们一起创建一个 2D 阵列。

为了排序,您可以argsort()在第一列(时间戳)上使用,它回传已排序的有序列的索引。然后,您可以使用这些索引来索引原始二维阵列,以按时间戳获取阵列的排序顺序。

arr = np.stack([timeStamp, data])
arr[:,arr[0].argsort()]
array([[   1,    2,    3,    9, 9999],
       [6234, 2372, 1251, 1245, 5172]])

使用 pandas datafames 和 sort_values

最后,同时处理多个串列的最佳方法是将它们视为 DataFrame 中的列。Pandas 提供了一个方便的框架来处理列/行排列的资料,在这种情况下非常有用,因为您还可以使用列名来标识每个阵列/列。

sort_values让你快速排序基于列名的完整资料。

import pandas as pd

df = pd.DataFrame(zip(timeStamp, data), columns=['timeStamp','data'])
print(df.sort_values('timeStamp'))
   timeStamp  data
1          1  6234
2          2  2372
3          3  1251
0          9  1245
4       9999  5172

uj5u.com热心网友回复:

您可以使用二维阵列。您可以使用

timestamp_data = [ [timeStamp[i], data[i]] for i in range(len(timeStamp)) ]

现在,您可以使用

sorted_timestamp_data = sorted(timestamp_data, key=lambda row: row[1])

uj5u.com热心网友回复:

字典对你来说非常有用。您可以zip data然后timeStamp排序,data然后将元组转换为dict(字典保留插入顺序)。然后您将拥有资料-时间戳对,其中资料是键,时间戳是值。

out = dict(sorted(zip(data, timeStamp)))

输出:

{1251: '0003', 2372: '0002', 5172: '9999', 6234: '0001'}

如果您想要 2 个单独的串列,则可以执行以下操作。不要强制转换为 dict 建构式,而是解压到串列:

data[:], timeStamp[:] = zip(*sorted(zip(data,timeStamp)))

输出:

[1251, 2372, 5172, 6234], ['0003', '0002', '9999', '0001']

uj5u.com热心网友回复:

取决于你想如何使用它。如果您不想使用其他库,我会使用类似的东西

result = sorted(({"timestamp": ts, "data": data} for ts, data in zip(timeStamp, data)), key=lambda d:d["data"]

这基本上是按资料排序的字典串列。我会选择字典串列,因为它比元组串列更具表现力。

uj5u.com热心网友回复:

要按照您描述的方式组织资料,您可以简单地执行以下操作:

sorted(zip(timeStamp, data), key=lambda x: x[1])

或者

from operator import itemgetter

sorted(zip(timeStamp, data), key=itemgetter(1))

要存盘这个物件,你可以pickle这里有一个很好的描述显然,有很多选项可以存盘它。

uj5u.com热心网友回复:

嗯,这很简单

records = list(zip(data, timeStamp))

排序:

records.sort()

在 Python 中,元组是从左到右逐元素比较的,因此在这种情况下不需要提供 key 函式。而已。正如在一些评论中那样,没有必要让它过于复杂。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *