2013-02-03 6 views
11

Ho un DataFrame che contiene molti dati intraday, il DataFrame ha diversi giorni di dati, le date non sono continue.python panda estrae le date uniche delle serie temporali

2012-10-08 07:12:22   0.0 0   0 2315.6 0  0.0 0 
2012-10-08 09:14:00   2306.4 20 326586240 2306.4 472 2306.8 4 
2012-10-08 09:15:00   2306.8 34 249805440 2306.8 361 2308.0 26 
2012-10-08 09:15:01   2308.0 1 53309040 2307.4 77 2308.6 9 
2012-10-08 09:15:01.500000 2308.2 1 124630140 2307.0 180 2308.4 1 
2012-10-08 09:15:02   2307.0 5 85846260 2308.2 124 2308.0 9 
2012-10-08 09:15:02.500000 2307.0 3 128073540 2307.0 185 2307.6 11 
...... 
2012-10-10 07:19:30   0.0 0   0 2276.6 0  0.0 0 
2012-10-10 09:14:00   2283.2 80 98634240 2283.2 144 2283.4 1 
2012-10-10 09:15:00   2285.2 18 126814260 2285.2 185 2285.6 3 
2012-10-10 09:15:01   2285.8 6 98719560 2286.8 144 2287.0 25 
2012-10-10 09:15:01.500000 2287.0 36 144759420 2288.8 211 2289.0 4 
2012-10-10 09:15:02   2287.4 6 109829280 2287.4 160 2288.6 5 
...... 

Come è possibile estrarre la data univoca nel formato datetime dal DataFrame precedente? Per avere risultato simile [2012-10-08, 2012-10-10]

risposta

24

Se si dispone di un Series come:

In [116]: df["Date"] 
Out[116]: 
0   2012-10-08 07:12:22 
1   2012-10-08 09:14:00 
2   2012-10-08 09:15:00 
3   2012-10-08 09:15:01 
4 2012-10-08 09:15:01.500000 
5   2012-10-08 09:15:02 
6 2012-10-08 09:15:02.500000 
7   2012-10-10 07:19:30 
8   2012-10-10 09:14:00 
9   2012-10-10 09:15:00 
10   2012-10-10 09:15:01 
11 2012-10-10 09:15:01.500000 
12   2012-10-10 09:15:02 
Name: Date 

dove ogni oggetto è un Timestamp:

In [117]: df["Date"][0] 
Out[117]: <Timestamp: 2012-10-08 07:12:22> 

si può ottenere solo la data chiamando .date():

In [118]: df["Date"][0].date() 
Out[118]: datetime.date(2012, 10, 8) 

e serie hanno un metodo .unique(). Così si può utilizzare map e un lambda:

In [126]: df["Date"].map(lambda t: t.date()).unique() 
Out[126]: array([2012-10-08, 2012-10-10], dtype=object) 

o utilizzare il metodo Timestamp.date:

In [127]: df["Date"].map(pd.Timestamp.date).unique() 
Out[127]: array([2012-10-08, 2012-10-10], dtype=object) 
+0

grazie, una domanda aggiuntiva, però, che cosa succede se ho fatto la colonna 'Date' essere indice,' df .index.map (pd.Timestamp.date) .unique() 'getta l'oggetto' 'numpy.ndarray 'non ha l'attributo' unique'' error – tesla1060

+1

@ tesla1060: puoi semplicemente reinserirlo in una' Series', con ' pd.Series (df.index) .map ecc. O se l'ordine non ha importanza, anche 'set (df.index.map (pd.Timestamp.date))' dovrebbe funzionare. – DSM

1

Utilizzando espressioni regolari:

(\d{4}-\d{2}-\d{2}) 

Run con re.findall funzione per ottenere tutti gli incontri:

result = re.findall(r"(\d{4}-\d{2}-\d{2})", subject)