2009-02-02 4 views
20

Utilizzando uno script Python, ho bisogno di leggere un file CVS in cui le date sono formate come GG/MM/AAAA e convertirle in AAAA-MM-GG prima di salvarlo in un database SQLite.Conversione della data tra GG/MM/AAAA e AAAA-MM-GG?

Questo quasi funziona, ma non è riuscito perché non fornisco tempo:

from datetime import datetime 

lastconnection = datetime.strptime("21/12/2008", "%Y-%m-%d") 

#ValueError: time data did not match format: data=21/12/2008 fmt=%Y-%m-%d 
print lastconnection 

Presumo ci sia un metodo nell'oggetto datetime per eseguire questa conversione molto facilmente, ma non riesco a trovare un esempio di come farlo. Grazie.

risposta

11

in primo luogo avrebbe bisogno di convertire la stringa in datetime tuple, e quindi convertire tale datetime tuple a stringa, che sarebbe andata in questo modo:

lastconnection = datetime.strptime("21/12/2008", "%d/%m/%Y").strftime('%Y-%m-%d') 
+0

Dire "tupla" sembra un po 'confuso; a partire da Python 2.2, 'strptime()' [restituisce "a' struct_time' "] (http://docs.python.org/library/time.html#time.strptime), che [è un oggetto] (http: //docs.python.org/library/time.html#time.struct_time) con un'interfaccia "tupla denominata". – supervacuo

43

Il tuo codice di esempio è sbagliato. Questo funziona:

import datetime 

datetime.datetime.strptime("21/12/2008", "%d/%m/%Y").strftime("%Y-%m-%d") 

La chiamata a strptime() analizza il primo argomento secondo il formato specificato nel secondo, così quei due devono corrispondere. Quindi puoi chiamare strftime() per formattare il risultato nel formato finale desiderato.

3

Qualcun altro pensa che sia uno spreco convertire queste stringhe in oggetti data/ora per quella che è, alla fine, una semplice trasformazione del testo? Se si è certi le date in arrivo saranno validi, si può semplicemente utilizzare:

>>> ddmmyyyy = "21/12/2008" 
>>> yyyymmdd = ddmmyyyy[6:] + "-" + ddmmyyyy[3:5] + "-" + ddmmyyyy[:2] 
>>> yyyymmdd 
'2008-12-21' 

Questo sarà quasi certamente più veloce rispetto alla conversione da e verso una data.

+8

Se sei preoccupato della velocità di conversione fino ad oggi, non hai nient'altro da cui preoccuparti. Il codice pubblicato da unwind è molto più chiaro e gestibile del tuo. Questa dovrebbe essere la tua preoccupazione principale qui, non la velocità. –

+0

Mi manca la possibilità di votare questo commento. –

1

Sono nuovo alla programmazione. Volevo convertire da yyyy-mm-dd a dd/mm/yyyy per stampare una data nel formato che le persone nella mia parte del mondo usano e riconoscono.

La risposta sopra accettata mi ha portato sulla buona strada.

La risposta che ho finito con al mio problema è il seguente:

import datetime 

today_date = datetime.date.today() 
print(today_date) 

new_today_date = today_date.strftime("%d/%m/%Y") 
print (new_today_date) 

Le prime due righe dopo l'istruzione import dà la data odierna nel formato USA (2017/01/26). Le ultime due righe lo convertono nel formato riconosciuto nel Regno Unito e in altri paesi (26/01/2017).

È possibile abbreviare questo codice, ma l'ho lasciato perché è utile per me come principiante. Spero che questo aiuti altri programmatori principianti a partire!

+0

Ciao e benvenuto su StackOverflow. La tua risposta non corrisponde alla domanda, che consisteva in una conversione da 'GG/MM/AAAA' a 'AAAA-MM-GG'. Il tuo post potrebbe essere cancellato, tuttavia ti incoraggio a mantenerti attivo nel sito. Grazie! – lrnzcig

+0

@lrnzcig Grazie per il tuo commento. Capisco cosa intendi. Forse avrei dovuto pubblicare la mia domanda e lasciare che qualcuno rispondesse - ho avuto un sacco di domande finora, ma sono riuscito a risponderle guardando online e nel mio fedele libro di pitone – Mark