2012-10-19 10 views
6

ho incontrato questo comportamento quando si fa munging dati di base, come in questo esempio:risultati imprevisti di min() e Max() di serie Panda fatta di Timestamp oggetti

In [55]: import pandas as pd 
In [56]: import numpy as np 
In [57]: rng = pd.date_range('1/1/2000', periods=10, freq='4h') 
In [58]: lvls = ['A','A','A','B','B','B','C','C','C','C'] 
In [59]: df = pd.DataFrame({'TS': rng, 'V' : np.random.randn(len(rng)), 'L' : lvls}) 

In [60]: df 
Out[60]: 
    L     TS   V 
0 A 2000-01-01 00:00:00 -1.152371 
1 A 2000-01-01 04:00:00 -2.035737 
2 A 2000-01-01 08:00:00 -0.493008 
3 B 2000-01-01 12:00:00 -0.279055 
4 B 2000-01-01 16:00:00 -0.132386 
5 B 2000-01-01 20:00:00 0.584091 
6 C 2000-01-02 00:00:00 -0.297270 
7 C 2000-01-02 04:00:00 -0.949525 
8 C 2000-01-02 08:00:00 0.517305 
9 C 2000-01-02 12:00:00 -1.142195 

il problema:

In [61]: df['TS'].min() 
Out[61]: 31969-04-01 00:00:00 

In [62]: df['TS'].max() 
Out[62]: 31973-05-10 00:00:00 

mentre questo sembra ok:

In [63]: df['V'].max() 
Out[63]: 0.58409076701429163 

In [64]: min(df['TS']) 
Out[64]: <Timestamp: 2000-01-01 00:00:00> 

dell'aggregazione dopo GroupBy:

In [65]: df.groupby('L').min() 
Out[65]: 
      TS   V 
L       
A 9.466848e+17 -2.035737 
B 9.467280e+17 -0.279055 
C 9.467712e+17 -1.142195 

In [81]: val = df.groupby('L').agg('min')['TS']['A'] 
In [82]: type(val) 
Out[82]: numpy.float64 

A quanto pare in questo caso particolare che ha qualcosa a che fare con l'utilizzo di indice di frequenza datetime come argomento della funzione pd.Series:

In [76]: rng.min() 
Out[76]: <Timestamp: 2000-01-01 00:00:00> 

In [77]: ts = pd.Series(rng) 
In [78]: ts.min() 
Out[78]: 31969-04-01 00:00:00 

In [79]: type(ts.min()) 
Out[79]: numpy.datetime64 

Tuttavia, il mio problema iniziale era con min/max di serie Timestamp analizzato da stringhe via pd.read_csv()

Cosa sto facendo male?

+1

Quale versione di Numpy stai usando? Ci sono problemi con la rappresentazione dei timestamp in 1.6. – meteore

+0

È tutto sotto Numpy 1.6.2 e Pandas 0.9.0, gestito tramite MacPorts. Seguendo il tuo suggerimento, ho trovato [segnalazioni di problemi simili] (https://groups.google.com/forum/#!msg/pystatsmodels/n1oBBVYI5FQ/DwuvAOc32yAJ), cercando solo di capire come si relazionano alla mia situazione. – LukaszJ

+0

BTW, Meteore, eri (o chiunque altro) in grado di replicare questo comportamento? – LukaszJ

risposta

5

Come sottolinea @meteore, si tratta di un problema con la stringa repr del tipo np.datetime64 in NumPy 1.6.x. I dati sottostanti, dovrebbero essere ancora corretti. Per ovviare a questo problema, puoi fare qualcosa del tipo:

In [15]: df 
Out[15]: 
    L     TS   V 
0 A 2000-01-01 00:00:00 0.752035 
1 A 2000-01-01 04:00:00 -1.047444 
2 A 2000-01-01 08:00:00 1.177557 
3 B 2000-01-01 12:00:00 0.394590 
4 B 2000-01-01 16:00:00 1.835067 
5 B 2000-01-01 20:00:00 -0.768274 
6 C 2000-01-02 00:00:00 -0.564037 
7 C 2000-01-02 04:00:00 -2.644367 
8 C 2000-01-02 08:00:00 -0.571187 
9 C 2000-01-02 12:00:00 1.618557 

In [16]: df.TS.astype(object).min() 
Out[16]: datetime.datetime(2000, 1, 1, 0, 0) 

In [17]: df.TS.astype(object).max() 
Out[17]: datetime.datetime(2000, 1, 2, 12, 0) 
+0

Vero, ma il risultato di min/max deve essere inserito come timestamp. Aprirò un problema: http://github.com/pydata/pandas/issues/2083 –

+0

Grazie! Quindi dovrei ignorare la rappresentazione del timestamp fino a quando il problema non sarà risolto? Solo in questo caso particolare o questo tipo di disturbo può essere generalizzato? – LukaszJ

+0

Il timestamp va bene. Il problema è la rappresentazione numpy.datetime64. Il timestamp è in realtà una sottoclasse di python datetime e come menzionato @Wes_Mckinney, inseriremo una correzione per inserire il valore di ritorno numpy.datetime64 come timestamp in modo che possa essere rappresentato correttamente. –