【问题标题】:How to downsample a python list having time如何对有时间的python列表进行下采样
【发布时间】:2021-10-01 14:40:31
【问题描述】:

我在 python 中有一个二维列表,其中包含图形的 X 和 Y 坐标。 像这样:

list1 = [[12345678, 12345678], [12345678, 12345678], [12345678, 12345678]]

每个内部列表的第一个元素是 X 轴,第二个是 Y 轴。所有 X 轴元素都是epoch (Unix timestamp),我想以某种方式减少此列表中的元素数量,方法是仅在某个设定间隔(例如 5 分钟)后保留时间戳。因此,应该删除下午 1:00 到下午 1:05 之间的任何点...

那么,如何以最有效的方式做到这一点

【问题讨论】:

  • 你也可以向我推荐一个库,它可以对数据进行足够接近的下采样,这样我就不需要每 5 分钟跳过一次数据......(如果可能的话)
  • 您需要一个开始时间和一个结束时间(开始时间 + 间隔)。对二维列表进行排序。遍历列表以查找大于或等于开始时间的第一个元素。记下它的位置(索引)。继续迭代,直到找到值大于结束时间的元素。注意索引。根据您确定的两个索引对原始数组进行切片。如果列表非常长,您可能需要实现二进制截断以建立比索引 0 更好的起点

标签: python arrays database list multidimensional-array


【解决方案1】:

如果我很好地理解了你的意思,那么这个代码示例可能会对你有所帮助。

import datetime
input_data = [[12345678, 12345678], [12346678, 12345678], [12346698, 12345678], [12446678, 12345678], [12455678, 12345678]]

# If you're sure that the input data is always sorted so you can skip this line input_data.sort(key=lambda x : x[0])

result = [input_data[0]] 
for i in range(1, len(input_data)):
    date = datetime.datetime.fromtimestamp(input_data[i][0])
    previous_date = datetime.datetime.fromtimestamp(result[-1][0])
    
    # 5 minutes = 5 * 60 = 300 seconds (you can change this to any time interval)
    if (date - previous_date).total_seconds() > 300 :
        result.append(input_data[i])

所以正如我上面提到的,如果您的列表已经排序,那么您可以跳过排序行。

那么这里发生了什么: 首先我们复制第一项 然后我们进入输入列表中的下一项,我们首先检查时差。如果差异小于 5 分钟,我们将忽略该项目,否则我们会将其附加到结果列表中。以此类推。

我希望这会有所帮助,否则你可以告诉我,如果我错过了理解你的问题。


PS:根据下面的评论,如果您使用枚举而不是范围,代码如下所示:

result = [input_data[0]]
for _, date_i in enumerate(input_data):
    date = datetime.datetime.fromtimestamp(date_i[0])
    previous_date = datetime.datetime.fromtimestamp(result[-1][0])

    # 5 minutes = 5 * 60 = 300 seconds (you can change this to any time interval)
    if (date - previous_date).total_seconds() > 300:
        result.append(date_i)

【讨论】:

  • @kauother 几天前我刚刚读到,在 Python 中,使用带有 range(1,len(x)) 的 for 循环而不是使用 enumrate(list) 更像是 Pythonic,这样您就可以访问索引和数据。
  • @AlejandroA 非常感谢,很高兴知道。我根据您的建议更新了答案??
  • @kauother 没问题!很高兴为您提供帮助,并感谢您帮助发布此内容的人!让我们一起学习:)
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2015-04-10
  • 2017-11-18
  • 1970-01-01
  • 2021-11-13
  • 2020-05-19
相关资源
最近更新 更多