2016-05-15 55 views
1

我有一个非常长的datetime s按时间顺序排序的列表(如果您愿意,单调递增)。试想一下,这样的事情:从日期时间列表中提取日,小时和秒

import datetime 
dates=[datetime.datetime.fromtimestamp(xx) for xx in xrange(huge_number)] 

对于我真正的名单不同的是,时间步长并不恒定,并有通常以秒,小时或天之间的差距。

我想要做的就是让用户选择(通过PyQt4的GUI)精确的日期时间,什么我猜这样做:

  1. 得到包含了所有不同天datetimes_list
  2. 为每一天,建立对应于这一天
  3. 每个小时都不同小时列表,获取对应于此小时

为了确保瞬间的完整列表,我可以用一些for/if循环来做到这一点,但我想知道是否有一种高效且紧凑的方法来做到这一点,也许使用itertoolsgroupby迭代器。但如果我真的不喜欢itertools,那么如果有人有一个好主意!

+0

您可以使用[bisect](https://docs.python.org/3.0/library/bisect.html)在排序列表中找到特定的日期时间。您应该(可能)动态构建您的2和3列表,以响应用户从上一个列表中选择条目。 –

+1

注意:本地时间不一定是单调的(例如,由于DST转换),因此'fromtimestamp()'的结果不一定会增加(取决于您当地的时区) – jfs

回答

1

为什么不使用字典或OrderedDict:

import collections 
d=collections.OrderedDict() 
for e in dates: 
    d.setdefault(e.strftime('%Y%m%d'),collections.OrderedDict()).setdefault(e.strftime('%H'), []).append(e.strftime('%H%M%S')) 

或者在不太紧凑但更可读的制剂:

import collections 
d=collections.OrderedDict() 
for e in dates: 
    day, hour, full_time=e.strftime('%Y%m%d'), e.strftime('%H'), e.strftime('%H%M%S') 
    d.setdefault(day,collections.OrderedDict()).setdefault(hour, []).append(full_time) 

它将导致O(1)访问时间,以任何日期选择/任意小时选择

+0

非常感谢您的支持回答。这对我很好! –

+0

很酷。如果你把这个答案标记为OK,会很好。 – Dvx