2016-05-15 105 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