2013-06-17 15 views
6

Ho un file CSV denominato data.csv comeModifica data di un DateTimeIndex

TS;val 
10:00;0.1 
10:05;0.2 
10:10;0.3 
10:15;0.4 

ho letto questo file CSV utilizzando questo script

#!/usr/bin/env python 
import pandas as pd 

if __name__ == "__main__": 
    yyyy = 2013 
    mm = 2 
    dd = 1 

    df = pd.read_csv('data.csv', sep=';', parse_dates=[0], index_col=0) 

    print(df) 

ottengo questo

     val 
TS      
2013-06-17 10:00:00 0.1 
2013-06-17 10:05:00 0.2 
2013-06-17 10:10:00 0.3 
2013-06-17 10:15:00 0.4 

I Desidero modificare la data di ogni DateTimeIndex al 2013-02-01

     val 
TS      
2013-02-01 10:00:00 0.1 
2013-02-01 10:05:00 0.2 
2013-02-01 10:10:00 0.3 
2013-02-01 10:15:00 0.4 

Qual è il modo più semplice per farlo?

+0

è possibile utilizzare 'datetime.replace (anno, mese, giorno)' nelle date – cmd

risposta

8

Timestamps hanno un metodo replace (proprio come datetimes):

In [11]: df.index.map(lambda t: t.replace(year=2013, month=2, day=1)) 
Out[11]: 
array([Timestamp('2013-02-01 10:00:00', tz=None), 
     Timestamp('2013-02-01 10:05:00', tz=None), 
     Timestamp('2013-02-01 10:10:00', tz=None), 
     Timestamp('2013-02-01 10:15:00', tz=None)], dtype=object) 

Quindi impostare l'indice a questo:

In [12]: df.index = df.index.map(lambda t: t.replace(year=2013, month=2, day=1)) 

la pena ricordare che si può passare una funzione date_parser a read_csv, che potrebbe avere più senso per te:

In [21]: df = pd.read_csv(file_name, sep=';', parse_dates=[0], index_col=0, 
          date_parser=lambda time: pd.Timestamp('2013/02/01 %s' % time)) 

In [22]: df 
Out[22]: 
        val 
TS 
2013-02-01 10:00:00 0.1 
2013-02-01 10:05:00 0.2 
2013-02-01 10:10:00 0.3 
2013-02-01 10:15:00 0.4 
+0

(non è nella documentazione, ma probabilmente dovrebbe essere, lo aggiungerò.) –

+1

un un modo leggermente diverso rispetto alla risposta di Andy: '' df.index = [Timestamp ('20130201') + timedelta (ore = t.hour, minuti = t.minute) per t in df.index.time] '' – Jeff

+0

Funziona bene ma mi chiedo se sarà più efficiente usare read_csv con parametri diversi. Perché read_csv imposta la data a oggi e sostituiamo la data ... forse potremmo farlo usando un solo passaggio? – scls

0

Vedo due modi per farlo. Il primo è il più semplice: utilizzare 'string'.split(' '). Per la stringa bb jj, verrà restituito un elenco di 2 elementi bb e jj, quindi è sufficiente ottenere il primo elemento.

La seconda opzione consiste nel creare un oggetto datetime dalla stringa e riformattarlo nel modo desiderato. Questa soluzione è migliore secondo me. Se domani vuoi un altro formato, questo sarà molto più facile. Per farlo: usare la funzione strptime documentato qui: http://docs.python.org/2/library/datetime.html#datetime.datetime.strptime

Poi per restituire una stringa da un oggetto datetime, è sufficiente utilizzare il strftime function. Tutto il formato diverso sono disponibili qui: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior

1

fornire un date_parser

In [50]: pd.read_csv(StringIO(data), sep=';', parse_dates=[0], 
        index_col=0, date_parser=lambda x: Timestamp('20130201 %s' % x)) 
Out[50]: 
        val 
TS      
2013-02-01 10:00:00 0.1 
2013-02-01 10:05:00 0.2 
2013-02-01 10:10:00 0.3 
2013-02-01 10:15:00 0.4 
Problemi correlati