2014-04-24 14 views
70

Ho un set di dati in cui tutte le date hanno il seguente formato:Stringhe di date scadenti?

2012-10-09T19:00:55Z 

mi piacerebbe essere in grado di essere in grado di utilizzare metodi come .weekday su di loro. Come posso convertirli nel formato corretto in Python?

+0

http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime-string-in-a-python-datetime-object duplicato? – hd1

risposta

117

È possibile utilizzare dateutil.parser.parse per analizzare le stringhe in oggetti datetime.

dateutil.parser.parse tenterà di indovinare il formato della stringa, se si conosce il formato esatto in anticipo, è possibile utilizzare datetime.strptime a cui si fornisce una stringa di formato (vedere la risposta di Brent Washburne).

from dateutil.parser import parse 

a = "2012-10-09T19:00:55Z" 

b = parse(a) 

print(b.weekday()) 
# 1 (equal to a Tuesday) 
+12

Non so perché non ho sentito parlare di 'dateutil.parser'. Queste sono le piccole cose che rendono Python fantastico. 'da somemodule import problemsolver && problemsolver.solvemyspecificproblem()' – kraxor

+14

@kraxor probabilmente perché non è in realtà parte di Python, piuttosto una libreria di terze parti. 'git clone http://example.com/module/problemsolver problemsolver && cd problemsolver && python problemsolver.py myspecificproblem' –

+1

@Ffisegydd Errore mio, ho fatto 'pip install dateutil' piuttosto che prepending con python-. – Paul

58

Questo è già stato risposto qui: How do I translate a ISO 8601 datetime string into a Python datetime object?

d = datetime.datetime.strptime("2012-10-09T19:00:55Z", "%Y-%m-%dT%H:%M:%SZ") 
d.weekday() 
+0

Questo non è ottimale, poiché richiede al chiamante di fornire stringhe di formato per la gamma piuttosto ampia di varianti ISO 8601 (a meno che non si voglia ValueError se i secondi vengono omessi, ad esempio). Il parser datautil, d'altra parte, gestisce questi molto meglio. –

+3

@ AlexNorth-Keys: come è questo subottimale? L'OP ha dichiarato "Ho un set di dati in cui tutte le date hanno il seguente formato" e non ho menzionato alcuna variante. Questa risposta è in realtà ottimale perché non richiede alcun modulo esterno, utilizza il modulo datetime incorporato. Usando la stringa di formato esatta (invece di avere datautil indovina il formato ogni volta), le prestazioni del codice sono ottimali. –

+2

Stavo pensando da una prospettiva di manutenzione (oops) - ma hai ragione, il metodo strptime è più veloce, in esecuzione in circa 1/6 del tempo l'approccio dateutil.parser fa. –

9

si dovrebbe avere uno sguardo a moment strega è un porto delle eccellenti js lib momentjs a Python.

Un vantaggio è il supporto di ISO 8601 stringhe formati, così come "formato%":

import moment 
time_string='2012-10-09T19:00:55Z' 

m = moment.date(time_string, '%Y-%m-%dT%H:%M:%SZ') 
print m.format('YYYY-M-D H:M') 
print m.weekday 

Risultato:

2012-10-09 19:10 
2 
Problemi correlati