【问题标题】:Python: group results by time intervalsPython:按时间间隔对结果进行分组
【发布时间】:2010-02-26 20:33:03
【问题描述】:

我从腌制文件中加载了大量数据。数据是一个排序的元组列表,包含一个日期时间和一个像这样的 int

[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
  (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
  (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
  etc
]

我想根据一些时间间隔获得人口密度。例如,我想抓取 5 分钟/1 分钟/30 秒周期内的记录数。

最好的方法是什么?我知道我可以遍历列表中的每个实例,但正在寻找更好的方法(如果存在的话)。

所需的输出类似于:

2010-01-01 04:10:00  --- 5000
2010-02-04 10:05:00  --- 4000
2010-01-02 13:25:00  --- 3999

【问题讨论】:

    标签: python


    【解决方案1】:

    bisect.bisect 是解决这个问题的另一种方法:

    import datetime
    import bisect
    import collections
    
    data=[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
      (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
      (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L),
    ]
    interval=datetime.timedelta(minutes=1,seconds=30)
    start=datetime.datetime(2010, 2, 26, 12, 6, 4)
    grid=[start+n*interval for n in range(10)]
    bins=collections.defaultdict(list)
    for date,num in data:
        idx=bisect.bisect(grid,date)
        bins[idx].append(num)
    for idx,nums in bins.iteritems():
        print('{0} --- {1}'.format(grid[idx],len(nums)))
    

    【讨论】:

      【解决方案2】:

      查看itertools.groupby。您可以传递一个计算正确存储桶的函数作为键。然后,您可以对生成的可迭代对象中的组运行聚合(计数、平均值、您有什么)。

      【讨论】:

      • +1。这看起来是一个很好的解决方案,我可能最终会走这条路,但@~unutbu 的回答完美地解决了我的问题。
      • 值得注意的是 itertools.groupby 只产生顺序组,(或者,如文档中所述:在给定的整个集合中进行分组并产生“真实”组,例如 SQL GROUP BY 等,您必须提供输入使用与 groupby 函数相同的键进行排序)。基本上,itertools groupby 只是在给定 key 函数产生的 key 与前一个 item 产生的 key 不同时按顺序断开一个组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2015-01-05
      相关资源
      最近更新 更多