2017-05-15 3 views
0

Ich habe eine Liste von Dateien, die mit einem rückwärts Datum- und Zeitstempel beginnen:Python: Iterieren Dateien mit der Zeit

201705150000_* 
201705150005_* 
201705150010_* 
201705150015_* 

Ich bin ein Skript zu schreiben, wo der Benutzer die Startzeit und die Dauer eingeben von benötigte Zeit, z 3 Stunden Das Skript fragt dann die angegebenen Dateien ab. Der Zeitschritt ist alle 5 Minuten, also 12 Dateien in einer Stunde.

Wenn es zum Ende der Stunde kommt, wie kann ich stoppen die nächste Datei ist 0060 und erzwingen sie 0100? Ich könnte alle möglichen Zeitvariationen manuell auflisten (zB 0005, 0010, 0015 usw.), aber es muss einen besseren Weg geben ...

Der Benutzer gibt diese Werte als Ganzzahlen ein.

Antwort

0

können Sie über die Werte durchlaufen, und jede passende Zeile ersetzen:

s = '201705150060_*' 
    if s.find('60',10) > 0: # checks 60 is a substring starting from location 10 
     s = s.replace('60', '100') 
    print(s) 

Wie Sie sehen können, ich habe eine Zeichenfolge, die s60 in seinem Ende enthält. Ich verifiziere das mit find und dann ersetze ich das 60 durch 100. Sie müssen nur diese in einer Schleife zu tun, obwohl ich nicht sicher bin, ob dies die pythonic Art und Weise, dies zu tun (Ich bin glücklich, bessere Wege :) zu hören)

+0

Ok. Aber ich müsste '0060' spezifizieren, da' 60' an anderer Stelle in der Zeichenkette sein könnte. Gleiches für '100'. – DonkeyKong

+0

@DonkeyKong Ich verstehe das Problem nicht. Sie befürchten, dass dieser Ersatz andere "60" in der Saite verändern würde? – CIsForCookies

+1

Es tut uns leid, gerade realisiert '10' ist der Startindex. Ich verstehe jetzt, danke. – DonkeyKong

0

Teilen Sie die letzten Ziffern 4 des Datums-Zeit-Felds in Stunden und Minuten, wandeln Sie sie in der richtigen Weise um und ersetzen Sie sie in der ursprünglichen Zeichenfolge.

def fixIt(s): 
    h, m = int(s[8:10]), int(s[10:]) 

    h += m // 60 
    m = m % 60 

    return s[:8] + "{:02d}{:02d}".format(h, m) 

{:02d} ist ein Platzhalter für h und m für die format() Funktion und Mittel für jeden (und mit 0 vor ihnen - für 1-stellige Zahlen) h und m auf die Saiten mit 2 Zeichen zu konvertieren.

0

Ich finde mit Datetime-Modul immer elegant für solche Zwecke. Zum Beispiel wird Code für jede Dauer generisch.

mit der Liste der Zeiten

file_times=["201705150000_","201705150005_","201705150010_","201705150015_"] 

jetzt diese Liste mit Datumzeit analysieren ein datetimelist

from datetime import datetime 
datelist=[s.split('_')[0] for s in a] 
datetimelist=[datetime.strptime(datei,"%Y%m%d%H%M") for datei in datelist] 

die strptime zu bekommen und das Format ist der Trick.

ermöglicht eine einfache Funktion Schreibzeiten innerhalb dieser Liste zu sondieren einen Benutzer Zeit in gleichem String-Format und die Zeitdauer angegeben.

def probetimes(datetimelist,stime,duration_in_seconds): 
    starttime=datetime.strptime(stime,"%Y%m%d%H%M") 
    real_starttime=min(datetimelist,key=lambda t: abs(t - newdt)) # bisect.left can be faster   
    startind=datetimelist.index(real_starttime) 
    stoptime=starttime+timedelta(**{'seconds':duration_in_seconds}) 

    try: 
     for current in datetimelist[startind:]: 
      if current<stoptime: 
       yield current.strftime('%Y%m%d%H%H') 
    except StopIteration: 
     pass #whatever you wants 

hier ausgegeben für ein Datum und Zeit für den nächsten 1 Stunde

print(list(probetime(datetimelist,'201705150012',3600))) 
['201705150000', '201705150000'] 
Verwandte Themen