2012-11-08 14 views
8

Ho due stringhe contenenti una data in questo modo"Python sottraendo due stringhe di data

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

Ho bisogno di eseguire:. end_date - start_date Esso dovrebbe restituire il numero di secondi che separano alla fine e date di inizio

Questo dato viene estratto dal twitter api: questo è quello che mi dà il json. Dal momento che sembra una stringa comunemente usata, presumo che ci sia una libreria o un metodo in grado di gestirlo, ma non riesco a trovarne uno.

risposta

10

ecco la risposta completa:

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

La soluzione non restituisce il numero corretto di secondi come scritto. È necessario aggiungere il numero di secondi in ogni giorno a delta.seconds. Il totale dei secondi è ((delta.days * 86500) + delta.seconds) –

+0

Hai ragione! Ho cambiato il codice per utilizzare il metodo .total_seconds() – sphere

3

Quanto duro hai guardato?

Il modulo Python datetime analizzerà questo formato e consentirà di eseguire l'aritmetica sugli oggetti risultanti.

Ecco il codice di esempio:

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

Si noti che in Windows (dove ho provato quanto sopra), la direttiva %z sembra non essere supportata, motivo per cui la parte +0000 è hard-coded. Se si prevede che questa parte (lo scostamento UTC) vari, sarà necessario gestirla in un passaggio separato, a meno che non sia possibile verificare che lo %z funzioni per l'utente.

2

utilizzare il metodo datetime.strptime per convertire la stringa in oggetto datetime. Potete trovare formati richiesti qui: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Nel tuo caso:

% nome del giorno della settimana abbreviato del Locale.
% b Nome del mese abbreviato di Locale.
% d Giorno del mese come numero decimale [01,31].
% H Ora (24 ore) come numero decimale [00,23].
% M Minuto come numero decimale [00,59].
% S Secondo come numero decimale [00,61].
% Y Anno con il secolo come numero decimale.
% z Scostamento UTC nel formato + HHMM o -HHMM (stringa vuota se l'oggetto è ingenuo).

1

è possibile analizzare le date utilizzando datetime.datetime.strptime(), allora si può fare manipolazioni aritmetiche?

2

Utilizzare datetime.strptime() per analizzare la stringa in base a un codice di formato. Nel tuo caso il formato sarebbe qualcosa come "%a %b %d %H:%M:%S %z %Y". (Nota: Non ho prove questo formato parse.)

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

Poi si può sottrarre datetime oggetti e ottenere un oggetto timedelta.

In alternativa, è possibile utilizzare uno dei wrapper API di Python Twitter elencati a pagina degli sviluppatori di Twitter, che probabilmente fare la conversione per voi: https://dev.twitter.com/docs/twitter-libraries#python

+0

Non è "datetime.datetime.strptime()'? – tehmisvh

0

da 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) 
Problemi correlati