2016-04-20 67 views
5

Ho un dizionario alerts[] che include la chiave alert_date. Tutte le date/orari sono memorizzati come stringhe. Sto visualizzando la data su Django, ma i modelli non possono formattare il tempo memorizzato come una puntura. Quindi, voglio convertirlo a mio avviso in quanto tale:Python: Convertire il dizionario degli orari della stringa in base alla data

foo = "2014-10-07 00:00:00" 
bar = datetime.strptime(foo, "%Y-%m-%d %H:%M:%S") 

Ma, voglio convertire tutti i valori di tempo del dizionario in una sola volta. Sto prendendo il dizionario come JSON attraverso una chiamata API. Voglio fare qualcosa di simile (che è ovviamente codice non valido):

alerts = resp_data['alerts'] 
for v in alerts['alert_date']: 
    v = datetime.strptime(v, "%Y-%m-%d %H:%M:%S") 

// EDIT: La risposta JSON è un dizionario che contiene alerts, che è una lista di dizionari come segue:

{"alerts": [ 
    { 
     "key1": "value11", 
     "key2": "value12", 
     "key3": "value13", 
     "alert_date": "2014-06-05 01:00:23.633000", 
    }, 
    { 
     "key1": "value21", 
     "key2": "value22", 
     "key3": "value23", 
     "alert_date": "2010-12-31 00:00:00", 
    } 
]} 
+0

per favore, inserisci anche il contenuto esatto della variabile di avvisi. Puoi sostituire i valori, ma ho bisogno di capire cosa contiene realmente –

+0

@Apero Non ho dichiarato che si trattava di un elenco di dizionari. Domanda aggiornata. Grazie! – Kilpatrick

risposta

3

EDIT: ora che avete aggiunto alcuni dati di risposta di esempio JSON, so che questa risposta è corretta, alertsè una lista di dicts:

Dal tuo esempio, io ora presumo che:

  • alerts è una lista di alert dizionari
  • alert['alert_date'] è una stringa di data

Quindi suggerirei di fare:

alerts = resp_data['alerts'] 
for alert in alerts: 
    alert['alert_date'] = datetime.strptime(alert['alert_date'], "%Y-%m-%d %H:%M:%S") 
+0

Ho dovuto cambiare la seconda linea in "per l'avviso negli avvisi:", ma in caso contrario ha funzionato. Grazie! – Kilpatrick

+0

Come menzionato @Kasramvd, il mio esempio strptime si aspetta un formato specifico.Ciò non è soddisfatto nei miei dati di esempio ("2014-06-05 01: 00: 23.633000"). Ho anche dovuto passare da una sorgente di dati a un'altra con una formattazione temporale coerente per far funzionare tutto questo. – Kilpatrick

+0

sì, l'integrità dell'origine dati e l'uniformità sono le più importanti. Ovviamente puoi provare, tranne all'interno di questo ciclo. –

2

È possibile utilizzare un dizionario di comprensione:

new_dict = {datetime.strptime(key, "%Y-%m-%d %H:%M:%S"): val for key, val in alerts['alert_date'].items()} 

si noti inoltre che, dal momento che si sta utilizzando datetime.strptime con una s formato specifico potrebbe aumentare un ValueError. Che in tal caso la comprensione del ditt non sarà utile. Quindi, se non siete sicuri circa la fromat delle vostre date è necessario gestire le eccezioni:

new_dict = {} 
for k, v in alerts['alert_date'].items(): 
    try: 
     new_dict[datetime.strptime(k, "%Y-%m-%d %H:%M:%S")] = v 
    except ValueError: 
     new_dict[datetime.strptime(k, "%Y-%m-%d %H:%M:%S")] = '' # or what you want 
-1

Se ho capito bene, si voleva cambiare solo le stringhe data nell'elenco alerts dizionari e lasciare le altre chiavi/valori non toccati. Vorrei suggerire i seguenti:

from datetime import datetime 

fmt = "%Y-%m-%d %H:%M:%S" 
alerts = map(lambda x: dict(x, **{'alert_date': datetime.strptime(x['alert_date'], fmt)}), alerts) 

Se il formato della data stringa è incoerente, come nel tuo esempio di risposta JSON, si potrebbe scendere la parte microsecondo eseguendo split():

from datetime import datetime 

def convert(s): 
    s = s.split('.')[0] 
    return datetime.strptime(s, "%Y-%m-%d %H:%M:%S") 

alerts = map(lambda x: dict(x, **{'alert_date': convert(x['alert_date'])}), alerts) 

La risultante alerts liste per entrambi gli esempi sono simili al seguente:

[{'alert_date': datetime.datetime(2014, 6, 5, 1, 0, 23), 
    'key1': 'value11', 
    'key2': 'value12', 
    'key3': 'value13'}, 
{'alert_date': datetime.datetime(2010, 12, 31, 0, 0), 
    'key1': 'value21', 
    'key2': 'value22', 
    'key3': 'value23'}]