2012-11-08 4 views
8

Ich habe zwei Zeichenketten enthalten ein Datum wie so“Python Subtraktion von zwei Datumsstrings

start_date = 'Sun Sep 16 16:05:15 +0000 2012' 
end_date = 'Sun Sep 17 23:55:20 +0000 2012' 

ich durchführen müssen. end_date - start_date Es sollte die Anzahl der Sekunden trennt das Ende Rückkehr und Startdaten

Diese Daten werden aus der twitter-API extrahiert, und das ist es, was mir der json gibt. Da es wie eine häufig verwendete Zeichenkette aussieht, nehme ich an, dass es eine Bibliothek oder Methode gibt, die damit umgehen kann. Ich kann sie nur nicht finden.

Antwort

10

Hier ist die vollständige Antwort:

from datetime import datetime 

start_date = 'Sun Sep 16 16:05:15 +0000 2012' 
end_date = 'Sun Sep 17 23:55:20 +0000 2012' 


def __datetime(date_str): 
    return datetime.strptime(date_str, '%a %b %d %H:%M:%S +0000 %Y') 

start = __datetime(start_date) 
end = __datetime(end_date) 

delta = end - start 
print delta # prints: 1 day, 7:50:05 
print delta.total_seconds() # prints: 114605.0 
+0

Ihre Lösung gibt nicht die korrekte Anzahl von Sekunden wie beschrieben zurück. Sie müssen die Anzahl der Sekunden pro Tag zu delta.seconds hinzufügen. Die Gesamtsekunden sind ((delta.days * 86500) + delta.seconds) –

+0

Sie haben Recht! Ich habe den Code geändert, um die .total_seconds() -Methode zu verwenden – sphere

3

Wie schwer hast du ausgesehen?

Python datetime Modul wird dieses Format analysieren, und Sie können die Arithmetik für die resultierenden Objekte tun.

Hier ist Beispielcode:

a = datetime.datetime.strptime("Sun Sep 16 16:05:15 +0000 2012", "%a %b %d %H:%M:%S +0000 %Y") 

Beachten Sie, dass in Windows (wo ich die oben versucht), die %z Richtlinie scheint nicht unterstützt werden, weshalb die +0000 Teil hartcodiert ist. Wenn Sie erwarten, dass dieser Teil (der UTC-Offset) variiert, müssen Sie dies in einem separaten Schritt behandeln, es sei denn, Sie können überprüfen, ob %z für Sie arbeitet.

2

Verwenden Sie die Methode datetime.strptime, um Ihre Zeichenfolge in das Datetime-Objekt zu konvertieren. Sie können hier erforderlichen Formaten: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

In Ihrem Fall:

% eine Abkürzung für den Wochentag Namen.
% b Der abgekürzte Monatsname des Gebietsschemas.
% d Tag des Monats als Dezimalzahl [01,31].
% H Stunde (24-Stunden-Uhr) als Dezimalzahl [00,23].
% M Minute als Dezimalzahl [00,59].
% S Sekunde als Dezimalzahl [00,61].
% Y Jahr mit dem Jahrhundert als Dezimalzahl.
% z UTC-Offset in der Form + HHMM oder -HHMM (leere Zeichenfolge, wenn das Objekt naiv ist).

1

Sie die Daten analysieren kann datetime.datetime.strptime() verwenden, dann können Sie arithmetische Manipulationen tun?

2

Verwenden Sie datetime.strptime(), um die Zeichenfolge gemäß einem Formatcode zu analysieren. In Ihrem Fall wäre das Format so etwas wie "%a %b %d %H:%M:%S %z %Y". (Anmerkung: Ich kann nicht dieses Parse-Format nicht getestet.)

Details: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Dann können Sie datetime Objekte subtrahieren und ein timedelta Objekt erhalten.

Oder eine der Python Twitter-API-Wrapper aufgelistet auf Twitter Entwickler-Seite verwenden könnte, die wahrscheinlich für Sie die Konvertierung tun: https://dev.twitter.com/docs/twitter-libraries#python

+0

Ist es nicht 'datetime.datetime.strptime()'? – tehmisvh

0

von Datetime import datetime

start_date = 'Sun Sep 16 16:05:15 +0000 2012' 
end_date = 'Sun Sep 17 23:55:20 +0000 2012' 


def __datetime(date_str): 
    return datetime.strptime(date_str, '%a %b %d %H:%M:%S +0000 %Y') 

start = __datetime(start_date) 
end = __datetime(end_date) 

delta = end - start 
print(delta) 
print(delta.total_seconds()) 

hours = (delta.total_seconds())/3600 

print("Hours %s" % hours) 

minutes = (delta.total_seconds())//3600 

print("minutes %s" % minutes) 
print(divmod(delta.total_seconds(), 3600)) 

h, m = divmod(delta.total_seconds(), 3600) 

print(h) 
print(m) 

M, s = divmod(m, 60) 
print(M) 
print(s)