2012-11-08 16 views
8

Mam dwa ciągi zawierające datę, jak tak”Python odjęcie dwóch łańcuchach daty

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

muszę wykonać. end_date - start_date Należy zwrócić liczbę sekund oddzielających koniec i daty rozpoczęcia

Te dane są wyodrębniane z api twittera.Jest to, co daje mi json.Odpowiedź, że wydaje się być powszechnie używanym ciągiem, przyjmuję, że istnieje biblioteka lub metoda, która może sobie z tym poradzić.Nie po prostu nie mogę go znaleźć.

Odpowiedz

10

Oto pełna odpowiedź:

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

Twoje rozwiązanie nie zwraca prawidłowej liczby sekund w formie pisemnej. Musisz dodać liczbę sekund każdego dnia do delta.seconds. Łączna liczba sekund to ((delta.days * 86500) + delta.seconds) –

+0

Masz rację! Zmieniłem kod, aby użyć metody .total_seconds() – sphere

3

Jak ciężko wyglądałeś?

Moduł Pythona datetime przeanalizuje ten format i pozwoli na wykonanie arytmetyki na wynikowych obiektach.

Oto przykładowy kod:

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

Należy pamiętać, że w systemie Windows (gdzie próbowałem powyżej), dyrektywa %z wydaje się nie być obsługiwana, dlatego też +0000 część jest zakodowane. Jeśli spodziewasz się, że ta część (przesunięcie UTC) będzie się różnić, musisz to zrobić w oddzielnym kroku, chyba że możesz sprawdzić, czy %z pracuje dla ciebie.

2

użyć metody datetime.strptime do konwersji ciągu znaków na obiekt datetime. Można znaleźć tu wymaganych formatów: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

W twoim przypadku:

% skrócona nazwa dnia tygodnia Locale za.
% b Nazwa skróconego miesiąca.
% d Dzień miesiąca jako liczba dziesiętna [01,31].
% H Godzina (zegar 24-godzinny) jako liczba dziesiętna [00,23].
% M Minuta jako liczba dziesiętna [00,59].
% S Drugi jako liczba dziesiętna [00,61].
% Y Rok ze stuleciem jako liczba dziesiętna.
% z Przesunięcie UTC w formularzu + HHMM lub -HHMM (pusty ciąg, jeśli obiekt jest naiwny).

1

można analizować datę używając datetime.datetime.strptime(), to można to zrobić arytmetyczne manipulacje?

2

Użyj polecenia datetime.strptime(), aby przeanalizować ciąg znaków zgodnie z kodem formatu. W twoim przypadku format będzie podobny do "%a %b %d %H:%M:%S %z %Y". (Uwaga: Nie testowałem tego formatu przetworzenia.)

szczegóły: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Następnie można odjąć datetime obiektów i uzyskać timedelta obiekt.

Albo, można skorzystać z jednej z Pythona Twitterze obwolut API wymienionych na stronie dewelopera Twittera, który prawdopodobnie zrobić to za ciebie: https://dev.twitter.com/docs/twitter-libraries#python

+0

Czy to nie jest 'datetime.datetime.strptime()'? – tehmisvh

0

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