2016-05-15 11 views
1

Ich habe eine sehr lange Liste von datetime s chronologisch sortiert (monoton steigend, wenn Sie bevorzugen). Stellen Sie sich vor etwas wie folgt aus:Tage, Stunden und Sekunden aus einer Liste von Datumsangaben extrahieren

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

der Unterschied in Bezug auf meine wirkliche Liste ist, dass der Zeitschritt nicht immer konstant ist, und es gibt in der Regel Lücken zwischen Sekunden, Stunden oder Tage.

Was ich tun möchte, ist ein Benutzer (über eine PyQt4 GUI) eine genaue Datumzeit wählen zu machen, und was ich vermute, dies zu tun:

  1. alle verschiedenen Tagen in datetimes_list
  2. enthalten erhalten für jeden Tag, um eine Liste mit allen verschiedenen Stunden bauen bis heute
  3. für jede Stunde entspricht, die die vollständige Liste der Zeitpunkte erhalten zu dieser Stunde

sicher entspricht, I kann dies mit einigen for/if-Schleifen tun, aber ich frage mich, ob es eine effiziente und kompakte Möglichkeit gibt, dies zu tun, vielleicht mit itertools und groupby Iterator. Aber wenn ich mich wirklich nicht wohl fühle mit itertools, also wenn jemand eine Idee hat, wäre das toll!

+0

Spezifische Datumsangaben finden Sie in Ihrer sortierten Liste mit [bisect] (https://docs.python.org/3.0/library/bisect.html). Sie sollten (wahrscheinlich) Ihre Listen 2 und 3 dynamisch erstellen, wenn der Benutzer einen Eintrag aus der vorherigen Liste auswählt. –

+1

Hinweis: Die Ortszeit ist nicht unbedingt monoton (zB aufgrund von DST - Übergängen) und daher sind die Ergebnisse von 'fromtimestamp()' in Ihrem Fall nicht unbedingt erhöht (abhängig von Ihrer lokalen Zeitzone) – jfs

Antwort

1

Warum nicht ein Wörterbuch oder ein OrderedDict mit:

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')) 

Oder in einer weniger kompakt, aber lesbarer Formulierung:

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) 

Es in O (1) Zugriffszeit für jede führen Datumsauswahl/beliebige Stundenauswahl

+0

Vielen Dank für Ihre Hilfe Antworten. Das funktioniert gut für mich! –

+0

Kühl. Wäre toll, wenn Sie diese Antwort als ok markieren. – Dvx

Verwandte Themen