2015-06-01 17 views
19

In questo momento ho:pitone formato strptime con punte opzionali

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 

Questa grande opera meno che non sto conversione di una stringa che non ha i microsecondi. Come posso specificare che i microsecondi sono opzionali (e dovrebbero essere considerati 0 se non sono nella stringa)?

risposta

17

si potrebbe usare un try/except blocco:

try: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
except ValueError: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') 
9

Che dire semplicemente aggiungendo, se non esiste?

if '.' not in date_string: 
    date_string = date_string + '.0' 

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
2

Preferisco usare le espressioni regolari invece di provare e tranne. Ciò consente molte fallback di formati accettabili.

# full timestamp with milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ") 

# timestamp missing milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ") 

# timestamp missing milliseconds & seconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ") 

# unknown timestamp format 
return false 

Non dimenticare di importare "re" e "datetime" per questo metodo.

0
datetime(*map(int, re.findall('\d+', date_string))) 

può analizzare sia '%Y-%m-%d %H:%M:%S.%f' e '%Y-%m-%d %H:%M:%S'. È troppo permissivo se il tuo input non è filtrato.

È veloce e sporco ma talvolta lo strptime() è troppo lento. Può essere utilizzato se si sa che l'input ha il formato di data previsto.

+0

Fornisce risultati errati se, in "data_string', gli zero finali vengono omessi dalla parte del microsecondo. – jez

+1

@jez: sì, è per questo che ho detto che è "troppo permissivo". Funziona solo se l'input ha il formato previsto (nessuna o 6 cifre per microsecondi). 2- sulla tua modifica: guarda la domanda: 'datetime' è la classe qui, non il modulo. – jfs