2012-10-19 12 views
6

I napotkanych Zachowanie to sposób podstawowy munging danych, jak w tym przykładzie:nieoczekiwane wyniki min() i maksymalnej() w serii PANDAS wykonane znacznika czasu obiektów

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 

problem:

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 

natomiast to wygląda ok:

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

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

podczas agregowania po 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 

Widocznie w tym konkretnym przypadku ma ona coś wspólnego z użyciem indeksu datetime częstotliwości jako argument funkcji 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 

Jednak mój początkowy problem był z min/max serii Timestamp parsowane przez łańcuchy pd.read_csv()

Co robię źle?

+1

Jaką wersję Numpy używasz? Występują problemy z reprezentacją znaczników czasu w 1.6. – meteore

+0

Wszystko to w ramach Numpy 1.6.2 i Pandas 0.9.0, utrzymywanych przez MacPorts. Po Twojej podpowiedzi znalazłem [podobne raporty o problemach] (https://groups.google.com/forum/#!msg/pystatsmodels/n1oBBVYI5FQ/DwuvAOc32yAJ), próbując po prostu dowiedzieć się, jak odnoszą się one do mojej sytuacji. – LukaszJ

+0

BTW, Meteore, czy ty (lub ktokolwiek inny) jesteś w stanie powtórzyć to zachowanie? – LukaszJ

Odpowiedz

5

Jak wskazuje @meteore, jest to problem z ciągiem znaków typu np.datetime64 w NumPy 1.6.x. Dane bazowe powinny nadal być poprawne. Aby obejść ten problem, możesz zrobić coś takiego:

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

Prawda, ale wynik min/max powinien być podany jako Znaczniki czasu. Otwieram problem: http://github.com/pydata/pandas/issues/2083 –

+0

Dzięki! Więc powinienem po prostu ominąć reprezentację Timestamp, dopóki problem nie zostanie rozwiązany? Tylko w tym konkretnym przypadku czy można uogólnić ten rodzaj uciążliwości? – LukaszJ

+0

Znacznik czasu jest w porządku. Problemem jest reprezentacja numpy.datetime64. Znacznik czasu jest faktycznie podklasą datetime Pythona i jako @Wes_Mckinney wspomniano, będziemy wprowadzanie poprawki, aby pudełko wartości zwracanej numpy.datetime64 jako znacznik czasu, aby mógł być reprezentowany poprawnie. –

Powiązane problemy