【问题标题】:Fastest way of creating and sorting the timestamp data with Python?使用 Python 创建和排序时间戳数据的最快方法是什么?
【发布时间】:2022-01-09 11:32:45
【问题描述】:

假设我将有两个数组。第一行将指定时间戳,第二行将是数据。

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

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

存储它们的最佳方式是什么?假设我想将数据从小到大排序,同时保留它们的时间戳值?

【问题讨论】:

  • 我在下面的回答中展示了多种方法可以做到这一点。

标签: python arrays list numpy sorting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用二维数组。您可以使用

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

    现在,您可以使用排序

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

    【讨论】:

    • hmm 所以你提议创建一个二维数组并使用排序函数对其进行排序,我认为这是使用每个值的索引来保持第一行附加到第二行我想?
    • 不,您正在创建一个看起来像这样的数组:[[1, 6234], [2, 2372], [3, 1251], [9999, 5172]] 然后,您将按每个子数组的第二个值对其进行排序
    【解决方案3】:

    字典对你来说非常有用。您可以zipdatatimeStamp 并按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']
    

    【讨论】:

    • 直截了当的解释,我很感激!
    【解决方案4】:

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

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

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

    【讨论】:

    • 我可以使用其他库,但我想知道这样做的正确方法是什么。所以你的建议是使用字典并通过 for 循环对其进行排序?我说的对吗?
    【解决方案5】:

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

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

    from operator import itemgetter
    
    sorted(zip(timeStamp, data), key=itemgetter(1))
    

    要存储这个对象,你可以pickle 它,一个很好的描述是here。 显然,存储它有很多选择。

    【讨论】:

      【解决方案6】:

      嗯,就这么简单

      records = list(zip(data, timeStamp))
      

      排序:

      records.sort()
      

      在 Python 中,元组是从左到右逐元素比较的,所以在这种情况下不需要提供 key 函数。 而已。没有必要像某些 cmets 那样过于复杂。

      【讨论】:

        猜你喜欢
        • 2021-04-20
        • 2021-06-23
        • 1970-01-01
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多