2013-01-17 7 views
7

Quindi so stringhe Python sono immutabili, ma ho una stringa:Il modo più veloce per inserire questi trattini nella stringa di Python?

c['date'] = "20110104" 

che vorrei convertire in

c['date'] = "2011-01-04" 

Il mio codice:

c['date'] = c['date'][0:4] + "-" + c['date'][4:6] + "-" + c['date'][6:] 

sembra un po ' contorto, no? Sarebbe meglio salvarlo come variabile separata e poi fare lo stesso? O fondamentalmente non ci sarebbe differenza?

risposta

12

Si potrebbe utilizzare .join() per ripulirlo un po ':

d = c['date'] 
'-'.join([d[:4], d[4:6], d[6:]]) 
+2

Se la prestazione è ciò che OP indica con "più veloce", ho trovato che ''-'. Join ((d [: 4], d [4: 6], d [ 6:])) 'è leggermente più veloce (cioè tupla invece di una lista). – mgilson

+0

Mi sembra molto pulito e pitonico :) – LittleBobbyTables

6

Si sta meglio con formattazione di stringhe di concatenazione di stringhe

c['date'] = '{}-{}-{}'.format(c['date'][0:4], c['date'][4:6], c['date'][6:]) 

concatenazione di stringhe è generalmente più lento, perché come hai detto sopra le stringhe sono immutabili.

1

probabilmente farei così in questo modo, non che ci sia una grande quantità di guadagno:

d = c['date'] 
c['date'] = '%s-%s-%s' % (d[:4], d[4:6], d[6:]) 

Il grande il miglioramento (imho) sta evitando la concatenazione delle stringhe.

3
s = '20110104' 


def option_1(): 
    return '-'.join([s[:4], s[4:6], s[6:]]) 

def option_1a(): 
    return '-'.join((s[:4], s[4:6], s[6:])) 

def option_2(): 
    return '{}-{}-{}'.format(s[:4], s[4:6], s[6:]) 

def option_3(): 
    return '%s-%s-%s' % (s[:4], s[4:6], s[6:]) 

def option_original(): 
    return s[:4] + "-" + s[4:6] + "-" + s[6:] 

esecuzione %timeit su ciascuno cede questi risultati

  • option_1: 35.9 ns per loop
  • option_1a: 35,8 ns per loop
  • option_2: 36 ns per loop
  • option_3: 35.8 ns per loop
  • option_original: 36 ns per loop

Quindi ... scegliere il più leggibile perché i miglioramenti delle prestazioni sono marginali

0

Di solito non sono il tipo che dice "usare regex", ma questo è un buon caso d'uso per esso:

import re  
c['date']=re.sub(r'.*(\w{4})(\w{2})(\w{2}).*',r"\1-\2-\3",c['date']) 
2

Le date sono oggetti di prima classe in Python, con una ricca interfaccia per manipolarli. La libreria è datetime.

> import datetime 
> datetime.datetime.strptime('20110503','%Y%m%d').date().isoformat() 
'2011-05-03' 

Non reinventare la ruota!

1

Non sono sicuro se si desidera convertire in un oggetto datetime corretta o un codice piuttosto solo difficile il formato, è possibile effettuare le seguenti operazioni:

from datetime import datetime 
result = datetime.strptime(c['date'], '%Y%m%d') 
print result.date().isoformat() 

Input: '20110104'

uscita : '2011-01-04'