• 05.05.2024, 12:34
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Python: time-modul

Mittwoch, 3. Mai 2006, 14:19

moin!
Folgendes Problem:
ich habe viele Zeitangaben als string im folgenden Format:
HH:MM:SS,XXX (wobei XXX millsekunden sind)
jetzt will ich zu diesen Zeiten jeweils eine feste Dauer addieren (z.B. 2 Std, 3 min, 35 sek)
letzten endes will ich wieder einen String haben...

irgendwie macht das python-time modul das nicht, oder ich bin zu doof dafür?
Gute work-live-balance ist, wenn man von seinem Privatleben erschöpfter ist als von der Arbeit.

Re: Python: time-modul

Mittwoch, 3. Mai 2006, 17:09

Schau dir das datetime-Modul (2.3+) an, da gibt es timedelta-Objekte.

Folgende Möglichkeit:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import datetime

t_hr, t_min, t_sec, t_msec = (12, 45, 7, 123)

tobj = datetime.time(t_hr, t_min, t_sec, t_msec)
print tobj

dtobj = datetime.datetime.combine(datetime.datetime.today(), tobj)
print dtobj

tdelta = datetime.timedelta(hours=2, minutes=17, seconds=31, microseconds=321)
print tdelta

newtime = dtobj + tdelta
print newtime
print newtime.strftime('%H:%M:%S') + (',%06d' % newtime.microsecond)

Die Ursprungszeit habe ich einfach mal fest vergeben. Die kannst du entweder über time.strptime() beziehen (was aber leider keine Mikrosekunden kennt [edit: das liegt darin begründet, dass strftime() in ANSI C das ebenfalls nicht tut], musst also vorher absplitten und hinterher wieder anfügen) oder gleich mit .split(',') und .split(':') bzw. alternativ Regex (dürfte langsamer und umständlicher sein) auseinandernehmen.

Das timedelta-Objekt stellt die Zeitdifferenz dar, die du verrechnen möchtest. Hier kannst du komfortabel Stunden, Minuten etc. einzeln angeben. Möglicherweise macht es für dich aber mehr Sinn, direkt mit Timestamps zu arbeiten, d.h. die Ursprungszeit und die Differenz als Timestamp zu formulieren und diese dann einfach zu addieren/subtrahieren.

Aus mir nicht ganz verständlichen Gründen kann ich datetime.date- und datetime.datetime-Objekte, nicht aber datetime.time-Objekte mit einem timedelta-Objekt verrechnen, daher habe ich dtobj erzeugt.

Re: Python: time-modul

Freitag, 5. Mai 2006, 13:22

vielen Dank, das mit dem datetime war's...
das aber auch Zeitberechnungen nicht im modul "time" mit drin sind... aber egal.
letzten Endes ist es das hier geworden (kompletter code)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import os
import re
from datetime import datetime, timedelta
from time import *
i = 736
last_timeline = ""
out = open("out.txt", 'w')

# 10
# 00:00:47,600 --> 00:00:53,232
# And nothing will save us, except
# the Chalk of fate.

def check(filename, previous_entries, start_time):
    global i 
    num = re.compile('^[0-9]+$') #regulaerer Ausrduck fuer id des Untertitels
    current_entries = 0    
    # regulaerer ausdruck fuer Timestamp: 00:00:21,440 --> 00:00:24,750
    time = re.compile('^([0-9]{2}:){2}[0-9]{2},[0-9]{3} --> ([0-9]{2}:){2}[0-9]{2},[0-9]{3}$')
    for line in datei:
        zahl = num.match(line)        
        if zahl:
            current_entries+=1
            out.write(str(i + current_entries) + "\n")
        else:
            zeit = time.match(line)
            if zeit:
                start = line[:line.find(" --> ")]
                end = line[line.find(" --> ")+5:-1]
                last_timeline = line
                start = extract_time(start)
                end   = extract_time(end)            
                start = start + start_time
                end = end + start_time
                # rausschreiben, punkte durch Kommata ersetzen
                out.write( (str(start)[:-3] + " --> " + str(end)[:-3] + "\n").replace('.', ',') )
            else :
                out.write(line)
    i += current_entries
    out.close()


# erwartet eine Zeitangabe im Stil von "00:00:47,600"
def extract_time(zeit):
    ms = int(zeit[-3:])
    time = zeit[:-4]
    time = strptime( time, "%H:%M:%S")
    time = timedelta( 0, time.tm_sec, 0, int(zeit[-3:]), time.tm_min, time.tm_hour)
    return time




#timedelta( [days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

td = timedelta( 0,     45      , 0             ,0        ,   7      , 1     )
check("a.txt", i, td)


einige Sachen, die man dynamisch hätte machen können, sind jetzt halt fix (wie z.B. die id), aber da es sich ohnehin nur um das konvertieren einer einzigen Datei gehandelt hat...

sehr schön. endlich Untertitel :D
Gute work-live-balance ist, wenn man von seinem Privatleben erschöpfter ist als von der Arbeit.