2009-08-11 8 views
16

voglio analizzare date come questi in un oggetto datetime:pitone datetime strptime jolly

  • 12 dicembre 2008
  • 1 gennaio 2009

Di seguito lavorerà per la prima data :

datetime.strptime("December 12th, 2008", "%B %dth, %Y") 

ma non riuscirà per il secondo a causa del suffisso al numero del giorno ('st') . Quindi, c'è un carattere jolly non documentato in strptime? O un approccio migliore del tutto?

risposta

18

Provare a utilizzare il modulo dateutil.parser.

import dateutil.parser 
date1 = dateutil.parser.parse("December 12th, 2008") 
date2 = dateutil.parser.parse("January 1st, 2009") 

Ulteriore documentazione può essere trovato qui: http://labix.org/python-dateutil

+0

python-dateutil sembra essersi spostato. I documenti sono disponibili su https://dateutil.readthedocs.org/en/latest/ e ci sono collegamenti alla pagina di repo e di pypi di Github lì. – drevicko

7

strptime è difficile perché si basa sulla libreria C sottostante per la sua attuazione, in modo da alcuni dettagli differiscono tra le piattaforme. Non sembra che ci sia un modo per abbinare i personaggi di cui hai bisogno. Ma si potrebbe pulire i dati prima:

# Remove ordinal suffixes from numbers. 
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in) 
# Parse the pure date. 
date = datetime.strptime(date_in, "%B %d, %Y") 
+6

Sarei preoccupato per quello che farà ad agosto. –

+1

Ecco perché ho incluso la virgola finale. –

+1

Direi che è meglio aggiungere [\ d] {1,2} prima della tua espressione regolare. Dopotutto vuoi abbinare i suffissi dopo i numeri, giusto? :-) – Vince

9

È necessario Gustavo Niemeyer di python_dateutil - una volta che è installato,

>>> from dateutil import parser 
>>> parser.parse('December 12th, 2008') 
datetime.datetime(2008, 12, 12, 0, 0) 
>>> parser.parse('January 1st, 2009') 
datetime.datetime(2009, 1, 1, 0, 0) 
>>> 
1

Per chi, come me, vogliono solo qualcosa che "funziona" senza un ulteriore modulo, questa è una soluzione rapida e sporca.

string_list = ["th", "rd", "nd", "st"] 
time = None 
for str in string_list: 
    if (time is not None): 
     break 
    try: 
     match_string = '%B %d' + str +', %Y' 
     time = datetime.strptime("December 12th, 2008", match_string) 
    except Exception: 
     pass